- λ¬Έμ
μμ μ μ nμ κ° μ리μμ μ κ³±μ ν©μ κ³μ°νλ€. κ·Έλ κ² ν΄μ λμ¨ ν©λ κ° μ리μμ μ κ³±μ ν©μ κ³μ°νλ€. μ΄λ κ² λ°λ³΅ν΄μ 1μ΄ λμ¨λ€λ©΄, nμ μκ·ΌμλΌκ³ νλ€.
700μ μκ·Όμμ΄λ€.
- 72 + 02 + 02 = 49
- 42 + 92 = 97
- 92 + 72 = 130
- 12 + 32 + 02 = 10
- 12 + 02 = 1
2λ μκ·Όμκ° μλλ€.
- 22 = 4
- 42 = 16
- 12 + 62 = 37
- 32 + 72 = 58
- 52 + 82 = 89
- 82 + 92 = 145
- 12 + 42 + 52 = 42
- 42 + 22 = 20
- 22 + 02 = 4
- 42 = 16
- ... λλμ§ μλλ€
μμλ 1κ³Ό μκΈ°μμ μ μ μΈνκ³ μ½μκ° μλ μμ΄λ€. 2, 3, 5, 7, 11, 13, 17, 19, ... λ μμμ΄λ€.
μμμκ·Όμλ μμμ΄λ©΄μ μκ·ΌμμΈ μ«μμ΄λ€. 7, 13, 19, ... λ μμ μκ·Όμμ΄λ€.
nμ΄ μ£Όμ΄μ‘μ λ, nλ³΄λ€ μκ±°λ κ°μ λͺ¨λ μμμκ·Όμλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
- μ½λ
#include <iostream>
#include <vector>
#include <set>
using namespace std;
void isPrime(int n, vector<bool>& is_prime){
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i <= n; i++) {
if (is_prime[i]) {
for (int j = i * i; j <= n; j += i) {
is_prime[j] = false;
}
}
}
}
void isSanggeun(int n, vector<bool>& is_prime) {
is_prime[2] = is_prime[3] = is_prime[5] = false; // μ΄λ° μκ·Όμκ° μλ κ²λ€ μ§μ°κΈ°
for (int i = 7; i <= n; i++) {
if (is_prime[i]) { //μμμ΄λ©΄ μκ·ΌμμΈμ§ νμΈ
set <int> s; //μκ·Όμ κ³μ°κ²°κ³Όλ₯Ό μ μ₯ν set
int num = i; //κ³μ°ν κ°
while (true) {
int sum = 0; //κ³μ° κ²°κ³Ό
while (true) { // ν μλ¦Ώμμ© κ³μ°ν΄μ λνκΈ°
sum += ((num % 10) * (num % 10));
if (num >= 10) {
num /= 10;
}
else {
break;
}
}
if (s.find(sum) != s.end()) { // μ΄λ―Έ ν λ² κ³μ°ν κ²°κ³ΌλΌλ©΄
is_prime[i] = false;
break;
}
else if (sum == 1) {
break;
}
else {
s.insert(sum);
num = sum; //num κ°±μ
}
}
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
vector<bool>is_prime;
//μ
λ ₯
cin >> n;
//μ°μ°
//미리 nκΉμ§μ μμ ꡬνκΈ°
is_prime.assign(n + 1, true);
isPrime(n, is_prime);
//nκΉμ§μ μμ μκ·Όμ ꡬνκΈ°
isSanggeun(n, is_prime);
//μΆλ ₯
for (int i = 7; i <= n; i++) {
if (is_prime[i]) {
cout << i << "\n";
}
}
}
- ν΄μ€
1. isPrime ν¨μ
- μλΌν μ€ν λ€μ€μ 체λ₯Ό μ΄μ©νμ¬ nκΉμ§μ μμλ₯Ό ꡬνλ ν¨μ
2. isSanggeun ν¨μ
- μμμκ·Όμλ₯Ό ꡬνλ ν¨μ
- μ°μ°μ λ°λ³΅νλ€κ° κ°μ κ²°κ³Όκ° λμ€λ©΄ κ·ΈλλΆν°λ μμμκ·Όμμ ν΄λΉνμ§ μμ
: λ¨Όμ μ΄λ° μκ·Όμκ° μλ κ²λ€ falseλ‘ μ§μ°κΈ°
: 7λΆν° nκΉμ§ μμμ΄λ©΄ μκ·ΌμμΈμ§ νμΈ
: sumμ 첫째 μ리λΆν° μ κ³±ν΄μ μ μ₯
: numμ΄ 10λ³΄λ€ ν¬κ±°λ κ°μΌλ©΄ 10μΌλ‘ λλ λ€ λ°λ³΅, λ§μ½ μ΄μ 10λ³΄λ€ μμΌλ©΄ ν μλ¦¬μ© κ³μ°μ μλ£ν κ²μ΄λ―λ‘ break
: μ΄ν setμ μ΄λ―Έ sumμ΄ μ‘΄μ¬νλ©΄ μμ μκ·Όμκ° μλλ―λ‘ iλ₯Ό falseλ‘ μ§μ΄ λ€ break
: λ§μ½ sumμ΄ 1μ΄λΌλ©΄ μμ μκ·Όμμ΄λ―λ‘ κ·Έλ₯ break
: λ§μ½ μ λκ°μ§ λͺ¨λμ ν΄λΉνμ§ μλλ€λ©΄ κ³μ κ³μ°ν΄μΌνλ―λ‘ sumμ sμ λ£κ³ numμ sumμ λμ ν΄ λ€μ μ°μ° λ°λ³΅
3. main ν¨μ
: isPrime ν¨μλ₯Ό ν΅ν΄ nκΉμ§ μμ λͺ¨λ ꡬνκΈ°
: isSanggeum ν¨μλ₯Ό ν΅ν΄ nκΉμ§ μμ μκ·Όμ λͺ¨λ ꡬνκΈ°