69,774
社区成员
//我答案错误(知道交的是函数),写的函数不知道哪有毛病,感谢一阅一指点
题目描述
如果一个数去掉最高位或去掉最低位都是素数,我们就称这个数是穿着马甲的素数。请你定义一个函数判断一个数是不是穿着马甲的素数,如果是函数返回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;
}
预存100以内素数,然后判断10000以内素数会快很多(这题虽然n<10^5,但是去掉1位数字就是10000以内)。
然后11-14行的逻辑都是多余的,因为没有else,这些判断没有减小工作量,反而额外增加了。
接着17和20行,要么加break,要么直接return 0,完全没必要继续循环下去。
你的b后面那个n是被while改变过的,你在设个变量为一开始的n应该就行了。