无所不能样样精通的佬们,又遇到问题了

在学C的fw 2024-11-13 20:08:21

//我答案错误(知道交的是函数),写的函数不知道哪有毛病,感谢一阅一指点

题目描述

如果一个数去掉最高位或去掉最低位都是素数,我们就称这个数是穿着马甲的素数。请你定义一个函数判断一个数是不是穿着马甲的素数,如果是函数返回1,不是返回0,函数原型如下:
int IsVestPrime(int n);

注意:对于C/C++代码,本题只需要提交IsVestPrime函数的定义部分。并且函数内不能有输入输出语句。
math.h头文件已经包含,可以在函数中使用标准库中的数学函数。

输入

输入两个正整数m,n(10<m<n<105)

输出

输出m,n范围内所有的穿着马甲的素数,如果没有输出"no"。

样例输入 Copy

30 50

样例输出 Copy

32 33 35 37

//代码:

#include <stdio.h>
#include <math.h>
int IsVestPrime(int n){
    int a,b,p=1,i,cnt1=0,cnt2=0;
    a=n/10;
    while(n>9){
        n/=10;
        p*=10;
    }
    b=n%p;
    if(a<=3) cnt1=0;
    if(b<=3) cnt2=0;
    if(b==0||b==1) cnt2=1;
    if(a==1) cnt1=1;
    
    for(i=2;i<=(int)sqrt(a);i++){
        if(a%i==0) cnt1=1;
    }
    for(i=2;i<=(int)sqrt(b);i++){
        if(b%i==0) cnt2=1;
    }
    if(cnt1+cnt2==0) return 1;
    else return 0;
        
}
int main(){
    int m,n,cnt=0;
    scanf("%d%d",&m,&n);
    int i;
    for(i=m;i<=n;i++){
        if(IsVestPrime(i))
        {
            printf("%d ",i);
            cnt=1;
        } 
    }
    if(cnt==0) printf("no");
    return 0;
}

 

...全文
119 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

预存100以内素数,然后判断10000以内素数会快很多(这题虽然n<10^5,但是去掉1位数字就是10000以内)。

  • 举报
回复
@日立奔腾浪潮微软松下联想 好的,会尝试,感谢提供快捷思路
forever74 11-14
  • 打赏
  • 举报
回复

然后11-14行的逻辑都是多余的,因为没有else,这些判断没有减小工作量,反而额外增加了。
接着17和20行,要么加break,要么直接return 0,完全没必要继续循环下去。

  • 举报
回复
@forever74 OK,已简化,xiexie
  • 打赏
  • 举报
回复

你的b后面那个n是被while改变过的,你在设个变量为一开始的n应该就行了。

  • 举报
回复
@Ice_DrEaMTD 超级感谢

69,774

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧