[C++][Baekjoon][Math] 6588λ² κ³¨λλ°νμ μΆμΈ‘(feat. C++ μ μΆλ ₯ μκ° λ¨μΆ)
[λ¬Έμ ]
6588λ²: 골λλ°νμ μΆμΈ‘
κ° ν μ€νΈ μΌμ΄μ€μ λν΄μ, n = a + b ννλ‘ μΆλ ₯νλ€. μ΄λ, aμ bλ νμ μμμ΄λ€. μ«μμ μ°μ°μλ 곡백 νλλ‘ κ΅¬λΆλμ΄μ Έ μλ€. λ§μ½, nμ λ§λ€ μ μλ λ°©λ²μ΄ μ¬λ¬ κ°μ§λΌλ©΄, b-aκ° κ°μ₯ ν°
www.acmicpc.net
"4λ³΄λ€ ν° λͺ¨λ μ§μλ λ νμ μμμ ν©μΌλ‘ λνλΌ μ μλ€." λ 골λλ°νμ μΆμΈ‘μ΄ λ§λμ§ νλ Έλμ§ νμΈνλ λ¬Έμ .
κ° ν μ€νΈ μΌμ΄μ€μ λν΄μ, n = a + b ννλ‘ μΆλ ₯νλ€. μ΄λ, aμ bλ νμ μμμ΄λ€.
λ§μ½, nμ λ§λ€ μ μλ λ°©λ²μ΄ μ¬λ¬ κ°μ§λΌλ©΄, b-aκ° κ°μ₯ ν° κ²μ μΆλ ₯νλ€.
λ νμ μμμ ν©μΌλ‘ nμ λνλΌ μ μλ κ²½μ°μλ "Goldbach's conjecture is wrong."μ μΆλ ₯νλ€.
[νμ΄]
μκ° μ ν 1μ΄.
ν μ€νΈ μΌμ΄μ€μ κ°μλ 100,000κ°.
νμΈν΄μΌν μ§μ μ μ nμ λ²μ. 6 ≤ n ≤ 1000000
1μ΄μ μ ν μκ°μ λκΈ°μ§ μμΌλ €λ©΄ μ°μ° νμκ° 1μ΅ λ²μ μ΄κ³Όνλ©΄ μλλ€.
ν μ€νΈ μΌμ΄μ€μ κ°μκ° 100,000κ°μ΄κ³ νμΈν΄μΌν μ§μ μ μμ λ²μκ° 1,000,000 κΉμ§μ΄λ―λ‘ 1λΆν° nκΉμ§ λͺ¨λ μλ₯Ό νμΈνλ€λ©΄ μ΅μ μ κ²½μ° 100,000 * 1,000,000 μ μ°μ°μ μννκ² λμ΄ 100,000,000,000 = 1,000μ΅ λ²μ μ°μ°μ μνν΄μΌ νλ€. μ΄ λμ μ°μ° μ²λ¦¬ μκ°μ 1000μ΄κ° λ κ²μ΄λ€. 루νΈnκΉμ§ νμΈνλ€κ³ ν΄λ 100,000 * 1,000 = 100,000,000 = 10μ΅ λ²μ μ°μ°μ μνν΄μΌ νλ€. μμ§ 10μ΄...
λ°λΌμ μλ ν μ€ν λ€μ€μ 체λ₯Ό νμ©νμ¬ λ¬Έμ λ₯Ό νμ΄μΌ ν¨μ μ μ μλ€. μλ ν μ€ν λ€μ€μ 체λ 2λΆν° μμ μ λ°°μλ₯Ό λ€ μ§μ°λ λ°©λ²μΌλ‘ μκ°λ³΅μ‘λ O(N(log(logN)))λ₯Ό κ°μ§λ€.
κ·Έλ¬λ.......... μ무리 μ€μ¬λ μ μΆλ ₯μκ°μ μ€μ΄μ§ λͺ»ν΄ μκ°μ΄κ³Όκ° λ¬λ€. κ·Έλ¦¬κ³ 1λ², 2λ² νμ΄ λͺ¨λ μλ ꡬ문μ μΆκ°ν΄μ£Όλ ν΄κ²°λμλ€. μ΄ κ΅¬λ¬Έμ μμ°κ³ ν΄κ²°νλ €λ©΄ cin, cout λμ μ scanf, prinfλ₯Ό μ¬μ©νλ©΄ ν΄κ²°κ°λ₯νλ€. (4λ² μ½λ μ°Έκ³ . μ΄λ―Έ CμΈμ΄λ₯Ό μ¬μ©νλ€λ©΄ μκ΄μμ!)
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
λ§μΉλ©΄μ... C++ μ μΆλ ₯ μκ° λ¨μΆμ κ΄νμ¬ μ 리ν΄λ³΄μλ©΄!
1. cin, cout λμ μ scanf, printfλ₯Ό μ°μ. scanfλ 0.798μ΄μ μνμκ°μ κ°μ§λλ°, cinμ 2.051μ΄μ μκ°μ κ°λλ€κ³ νλ€.(μΆμ²: https://2heedu.tistory.com/64)
μ°Έκ³ λ‘ μμ ꡬ문μΌλ‘ c++κ³Ό cμ νμ€ μ€νΈλ¦Όμ λκΈ°ν λλ©΄ μ μΆλ ₯ μλλ₯Ό μ€μΌ μ μλ€. νμ§λ§ cμ c++ μ μΆλ ₯ μμκ° λ³΄μ₯λμ§ μμ λ λ¬Έλ²μ μμ΄μΌμ λ, μμκ° λ€μμ¬ λμ¬ μ μκ³ , c++ μ€νΈλ¦Όλ€μ thread μμ μ± μμ 보μ₯λμ§ μλλ€.
2. endl λμ "\n"λ₯Ό μ°μ. endlμ κ°νμ ν λΏ μλλΌ λ΄λΆ λ²νΌλ λΉμμ£Όλ―λ‘ "\n"λ³΄λ€ μλκ° λ리λ€.
[μ½λ] 3, 4λ² μ½λκ° μ λ΅ μ½λ!
1λ² νμ΄. μκ°μ΄κ³Ό.
#include <iostream>
#include <cmath>
using namespace std;
bool canGoldBahGuess(int num);
bool isPrime(int num);
int main() {
int num;
while(true) {
cin >> num;
if (num == 0) break;
if (!canGoldBahGuess(num)) cout << "Goldbach's conjecture is wrong.\n";
}
return 0;
}
bool canGoldBahGuess(int num) {
for (int i = 3; i <= num/2; i++) {//3λΆν° νμ&μμ νλ³
if (i % 2 != 0 && isPrime(i) && (num-i) % 2 != 0 && isPrime(num - i)){
cout << num << " = " << i << " + " << num - i << "\n";
return true;
}
}
return false;
}
bool isPrime(int num) {
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
2λ² νμ΄. μκ°μ΄κ³Ό
#include <iostream>
#include <cmath>
using namespace std;
void MakeDecimalTable();
bool canGoldbach(int num);
const int MAX_SIZE = 1000000;
int decimalTable[MAX_SIZE + 1];
int main() {
int num;
bool answer = true;
MakeDecimalTable();
while(true) {
cin >> num;
if (num == 0) break;
if (!canGoldbach(num)) cout << "Goldbach's conjecture is wrong.\n";
}
return 0;
}
void MakeDecimalTable() {
fill_n(decimalTable, sizeof(decimalTable)/sizeof(int), 1);
for (int i = 2; i <= sqrt(MAX_SIZE ); i++) {//2λΆν° μμνλ³νλ¬ gogo
if (decimalTable[i] != 0) {
for (int j = 2; i*j <= MAX_SIZE ; j++) {//κ·Έ λ°°μλ₯Ό λͺ¨λ 0μΌλ‘ λ°κΏ
decimalTable[i*j] = 0;
}
}
}
}
bool canGoldbach(int num) {
for (int i = 3; i <= num / 2; i++) {//3λΆν° μμ νλ³
if (decimalTable[i] && decimalTable[num - i]) {
cout << num << " = " << i << " + " << num - i << "\n";
return true;
}
}
return false;
}
3λ² νμ΄. ν΅κ³Ό.
#include <iostream>
#include <cmath>
using namespace std;
void MakePrimeTable();
bool canGoldbach(int num);
const int MAX_SIZE = 1000000;
int primeTable[MAX_SIZE + 1];
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
int num;
bool answer = true;
MakePrimeTable();
while(true) {
cin >> num;
if (num == 0) break;
if (!canGoldbach(num)) cout << "Goldbach's conjecture is wrong.\n";
}
return 0;
}
void MakePrimeTable() {//μλΌν μ€ν
λ€μ€μ 체
for (int i = 2; i <= sqrt(MAX_SIZE); i++) {//2λΆν° μμνλ³νλ¬ gogo
if (primeTable[i] == 0) {
for (int j = 2; i*j <= MAX_SIZE; j++) {//κ·Έ λ°°μλ₯Ό λͺ¨λ 0μΌλ‘ λ°κΏ
primeTable[i*j] = 1;
}
}
}
}
bool canGoldbach(int num) {
for (int i = 3; i <= num / 2; i++) {//3λΆν° μμ νλ³
if (primeTable[i] == 0 && primeTable[num - i] == 0) {
cout << num << " = " << i << " + " << num - i << "\n";
return true;
}
}
return false;
}
4λ² νμ΄. ν΅κ³Ό
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
const int MAX_SIZE = 1000000;
int main() {
vector<int> primeTable;
bool primeNoCheckTable[MAX_SIZE + 1];
for (int i = 2; i*i <= MAX_SIZE; i++) {//2λΆν° μμνλ³νλ¬ gogo
if (!primeNoCheckTable[i]) {
if(i != 2) primeTable.push_back(i);
for (int j = i + i; j <= MAX_SIZE; j += i) {//κ·Έ λ°°μλ₯Ό λͺ¨λ μμ νμΈμ λλλ€λ μλ―Έλ‘ trueλ‘ λ°κΏ
primeNoCheckTable[j] = true;
}
}
}
int num;
bool answer;
while (true) {
scanf("%d", &num);
if (num == 0) break;
for (int prime : primeTable) {
if (!primeNoCheckTable[num - prime]) {
printf("%d = %d + %d\n", num, prime, num - prime);
answer = true;
break;
}
}
if (!answer) printf("Goldbach's conjecture is wrong.\n");
}
return 0;
}