1#include<stdio.h>
2#include<string.h>
3char a[40010];
4int b[5000],c[5000];
5int main()
6{
7 int i, j, n, t, l1, l2,f;
8 memset(a, 1, sizeof(a));
9 memset(b, 0, sizeof(b));
10 for(i = 2;i <= 200;i++)
11 if(a[i])
12 {
13 t = 40000/i;
14 for(j = 2;j <= t;j++) a[i * j] = 0;
15 }
16 t = 0;
17 for(i = 2;i <= 40000;i++)
18 if(a[i])
19 {
20 b[t] = i;
21 n=i;
22 c[t]=0;
23 while(n)
24 {
25 c[t]+=n%10;
26 n/=10;
27 }
28 t++;
29 }
30 //printf("%d\n",c[0]);
31 while(scanf("%d",&n),n)
32 {
33 while(n++)
34 {
35 i=0;f=0;
36 while(b[i]*b[i]<=n)
37 {
38 if(n%b[i++]==0){f=1;break;}
39 }
40 if(f==0)continue;
41 i=0;t=n;l1=0;l2=0;
42 while(t)
43 {
44 l1+=t%10;
45 t/=10;
46 }
47 t=n;i=0;
48 while(b[i]*b[i]<=t)
49 {
50 while(t && t%b[i]==0)
51 {
52 l2+=c[i];
53 t/=b[i];
54 }
55 i++;
56 }
57 // printf("%d %d\n",t,n);
58 if(t>1)
59 while(t)
60 {
61 l2+=t%10;
62 t/=10;
63 }
64 //printf("%d %d %d\n",n,l1,l2);
65 if(l1==l2)break;
66 }
67 printf("%d\n",n);
68 }
69 return 0;
70}
71
72
先把20000以内的质数都求出来
然后枚举每一个数把它变成质数的和然后把那个数字自己也拆分就可以了就是一个简单的枚举和模拟。