return找素数
找出2-5000里面所有本身是素数,每一位是素数,各位相加的和还是素数,用函数实现
这个我想了一种,把不是素数的带上一个标记,最后判断时根据有无这个标记,这种方法的麻烦之处在于每个环节都要判断
同学提供了一种思路,用bool值去return,上次已经提到return可以终止一个函数体,对于素数性质十分好用,当以后函数进行某一步时不用再执行,就可以用这个方法。
代码比较简单
我的代码:
include <stdio.h>
int is_magic(int n)
{
int digit=0;
for(int i=2;i<=sqrt(n);i++)
{
if((n%i)==0) digit++;
}
if(digit==0) return 0;
else return -100;
}
int main()
{
int n;
int digit_num;
for(int i=2;i<5000;i++)
{
int sum=0;
n=i;
if(is_magic(n)<0)
{
continue;
}
int w=0;
while(n>0)
{
digit_num=n%10;
if(is_magic(digit_num)<0)
{
w++;
break;
}
sum+=digit_num;
n/=10;
}
if(w==1)
{
continue;
}
if(is_magic(sum)<0) continue;
printf("%d\n",i);
}
}
同学的方法:
include<stdbool.h>
include<string.h>
include<stdio.h>
include<math.h>
define MAX 5000
bool prime(int x)//判断一个数是否是素数
{
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)
{
return 0;//利用素数的特征,找到一个因数直接返回0
}
}
return 1;
}
bool check(int x)
{
if(prime(x)==0)
{
return 0;//数的本身是合数 ,直接返回0
}
int sum=0;
while(x)
{
if(prime(x%10)==0)
{
return 0;//有一位是合数,返回0
}
sum+=x%10;
x/=10;
}
return prime(sum);//最后再判断 各位的和
}
int main()
{
int p=0;
for(int i=2;i<=MAX;i++)
{
if(check(i))
{
printf("%5d",i);
}
}
return 0;
}

浙公网安备 33010602011771号