HDU 1058 构造表

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1058

一开始为了改造那表,直接是分别算出tn=in*n,n=2,3,5,7,之后取4个中最小值存储在temp中,如果temp==tn则在相应的i2,i3,i5,i7++,后来发现构造出来的表错了~TvT。在p[index],index==21的时候p[index]==26,原来26=13*2,此时26是4个中最小值,但是13却是除了2,3,5,7之外的质数。囧rz~~

正确的构表方法,应该是tn=p[in]*n; n=2,3,5,7.即让2,3,5,7乘以p数组前面相应下标in对应的p[in]值,这样确保除了2,3,5,7之外没有其他因数会被乘进来。具体实现看以下代码

View Code
 1 #include <stdio.h>
2 #define MAX 6000
3 int p[MAX];
4 int main()
5 {
6 int i2,i3,i5,i7;
7 int t2,t3,t5,t7,temp;
8 i2=i3=i5=i7=1;
9 p[1]=1;
10 for(int i=2;i<MAX;i++)
11 {
12 temp=t2=p[i2]*2;
13 t3=p[i3]*3;
14 t5=p[i5]*5;
15 t7=p[i7]*7;
16 if(temp>t3) temp=t3;
17 if(temp>t5) temp=t5;
18 if(temp>t7) temp=t7;
19 if(temp==t2) i2++;
20 if(temp==t3) i3++;
21 if(temp==t5) i5++;
22 if(temp==t7) i7++;
23 p[i]=temp;
24 //printf("%d ",p[i]);
25 }
26 int n,cnt=1;
27 while(scanf("%d",&n),n!=0)
28 {
29 if((n%100)/10==1)
30 {
31 printf("The %dth humble number is %d.\n",n,p[n]);
32 }
33 else {
34 if(n%10==1) printf("The %dst humble number is %d.\n",n,p[n]);
35 else if(n%10==2) printf("The %dnd humble number is %d.\n",n,p[n]);
36 else if(n%10==3) printf("The %drd humble number is %d.\n",n,p[n]);
37 else printf("The %dth humble number is %d.\n",n,p[n]);
38 }
39 cnt++;
40
41 }
42 }

 

posted @ 2012-02-09 19:18  HUJJ  阅读(184)  评论(0编辑  收藏  举报