左嘉


私信TA

用户名:zuojia

访问量:88645

签 名:

Jz

等  级
排  名 5
经  验 34540
参赛次数 226
文章发表 72
年  龄 40
在职情况 在职
学  校 北京理工大学
专  业

  自我简介:

解题思路:
本想查表判断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 人评分

  评论区

老哥,咱俩差不多一样方法,提示时间超限。。。
2019-03-08 15:59:10
  • «
  • 1
  • »