只要很朴素的分解就可以了,数据量不大
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <iostream> #include <stack> #include <algorithm> #define ll long long using namespace std; const int INF = 0x3f3f3f3f; const int MAXSIZE = 10100000; ll n; stack <int> s; void init_prim(){ memset(visit, true, sizeof(visit)); int num = 0; for (int i = 2; i <= nn; ++i){ if (visit[i] == true){ num++; prime[num] = i; } for (int j = 1; ((j <= num) && (i * prime[j] <= nn)); ++j){ visit[i * prime[j]] = false; if (i % prime[j] == 0) break; //点睛之笔 } } } ll quickpow(ll m,ll n,ll k){ int b = 1; while (n > 0){ if (n & 1) b = (b*m)%k; n = n >> 1 ; m = (m*m)%k; } return b; } ll getsum(int x){ int sum = 0; while(x){ sum += x % 10; x = x / 10; } return sum; } bool witness(ll a,ll n){ ll t,d,x; d = 1; int i=ceil(log(n-1.0)/log(2.0)) - 1;//j for(;i>=0;i--) { x=d; d=(d*d)%n; if(d==1 && x!=1 && x!=n-1) return true; if( ((n-1) & (1<<i)) > 0) d=(d*a)%n; } return d==1? false : true; } bool miller_rabin(ll n){ int s[]={2,7,61}; if(n==2 || n == 1) return true; if(n==1 || ((n&1)==0)) return false; for(int i=0;i<3;i++)// 3 if(witness(s[i], n)) return false; return true; } bool isPrime(ll n){ if(n == 1 || n == 2 || n == 3 || n == 5) return true; else if(n % 2 == 0 || n % 3 == 0 || n % 5 == 0) return false; for(int i = 2; i <= sqrt(n); ++i){ if(n % i == 0) return false; } return true; } bool judge(ll x){ int sum1, sum2 = 0, i; sum1 = getsum(x); for(i = 2; i <= sqrt(x); ++i){ if(x % i == 0){ s.push(i); x = x / i; while(x % i == 0){ s.push(i); x = x / i; } } if(x == 1) break; } if(x > 1) s.push(x); while(!s.empty()){ sum2 += getsum(s.top()); s.pop(); } if(sum1==sum2) return true; else return false; } int main(){ int i, j, k; while(cin >> n){ if(n <= 0) break; ll num = n; while(1){ ++num; if(isPrime(num)) continue; else if(judge(num)){ cout << num << endl; break; } } } return 0; }