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;
	}
posted @ 2020-12-16 00:20  empty_thought  阅读(87)  评论(0)    收藏  举报