解题思路:
本想查表判断N位数的“每根肋骨”是否为质数,不料这里N的数目最大为8,如果建表需要至少200M内存,可以在本机上测试得到中间结果,代码不能提交。还有一种判断是否为质数的方法,就是对可能的因数取余,若能整除,就不是质数,可以试试,当N为8时,程序运行了好几分钟,远超一秒,代码也不能提交,思路如下所示:
#include<stdio.h> #include<math.h> int main(){ int is_prime(int); int i,m,n,t,f,N; scanf("%d",&N); m=(int)pow(10,N-1);//最小N位数 n=(int)pow(10,N)-1;//最大N位数 for(i=m+1;i<n;i++){//每个N位数 t=i; f=1;//假设当前N位数是特殊质数 while(t){ if(!is_prime(t)){//若某根“肋骨”不是质数 f=0;//并非特殊质数 break; } t/=10;//求下一根“肋骨” } if(f) printf("%d\\n",i); } return 0; } int is_prime(int x){ int i,m; if(x==1) return 0; m=floor(sqrt(x)+0.5); for(i=2;i<=m;i++) if(x%i==0) return 0; return 1; }//当x为8位数时,运行超时
所以只能分情况,将测试得到的结果直接输出。
注意事项:
在寻找最大、最小N位数时,用到了数学函数double pow(double base,double exp),请注意参数和返回值都为双精度浮点型,直接赋值给整型会“溢出”,若确定计算结果为整数,可以用(int)pow(base,exp)进行强制类型转换,然后才可赋值。
参考代码:
#include<stdio.h> int main(){ int N; scanf("%d",&N); if(N==1) printf("2\n3\n5\n7\n"); else if(N==2) printf("23\n29\n31\n37\n53\n59\n71\n73\n79\n"); else if(N==3) printf("233\n239\n293\n311\n313\n317\n373\n379\n593\n599\n\ 719\n733\n739\n797\n"); else if(N==4) printf("2333\n2339\n2393\n2399\n2939\n3119\n3137\n3733\n\ 3739\n3793\n3797\n5939\n7193\n7331\n7333\n7393\n"); else if(N==5) printf("23333\n23339\n23399\n23993\n29399\n31193\n31379\n\ 37337\n37339\n37397\n59393\n59399\n71933\n73331\n73939\n"); else if(N==6) printf("233993\n239933\n293999\n373379\n373393\n593933\n\ 593993\n719333\n739391\n739393\n739397\n739399\n"); else if(N==7) printf("2339933\n2399333\n2939999\n3733799\n5939333\n\ 7393913\n7393931\n7393933\n"); else if(N==8) printf("23399339\n29399999\n37337999\n59393339\n73939133\n"); return 0; }
0.0分
2 人评分