TOJ 1073 Smith Numbers 解题报告

 

 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, 1sizeof(a));
 9    memset(b, 0sizeof(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以内的质数都求出来
然后枚举每一个数把它变成质数的和然后把那个数字自己也拆分就可以了就是一个简单的枚举和模拟。

posted on 2008-07-15 19:16 gong 阅读(202) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(6)

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜