思路: 从当前数字开始往上暴力,找到合数之后质因式分解,看是否满足那个关系。
#include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <cstdio> using namespace std; #define maxn 40000 bool vis[maxn]; int n_prime=0; int prime[maxn/8]; int cnt[maxn/8]; void Prime() { memset(vis,true,sizeof(vis)); vis[0]=vis[1]=0; for(int i=2;i<maxn;i++) if(vis[i]) { prime[++n_prime]=i; for(int j=2*i;j<maxn;j+=i) vis[j]=false; } //cout<<n_prime<<":"<<prime[n_prime]<<endl; } bool is_prime(int n) { if(n<maxn) return vis[n]; for(int i=1;i<=n_prime;i++) { if(n%prime[i]==0) return false; } return true; } int digit_sum(int n) { int ans=0; while(n) { ans+=n%10; n/=10; } return ans; } int main() { Prime(); int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); int ans=n+1; while(1) { if(is_prime(ans)) { ans++; } else { int tmp=digit_sum(ans); memset(cnt,0,sizeof(cnt)); int tnt=ans; int pnt=0; for(int i=1;i<=n_prime;i++) { if(tnt<prime[i]) break; while(tnt%prime[i]==0) { cnt[i]++; tnt/=prime[i]; } pnt+=cnt[i]*digit_sum(prime[i]); } if(tnt!=1) pnt+=digit_sum(tnt); if(pnt==tmp) { printf("%d ",ans); break; } ans++; } } } return 0; }