验证哥德巴赫猜想:任一充分大的偶数,可以用两个素数之和表示。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n, p, q;          //n 是偶数,并将它分成 p,q
	int flagp, flagq, j;  //p,q 为素数时,flag = 1; j在循环时使用 
	p = 1;                //之所以不让 p = 0;是因为 1 不是素数,编程完毕之后可以比较一下两者的区别

	
	//输入一个偶数 n
	printf("请输入一个偶数:");      //提示输入
	scanf("%d", &n);               //输入 n
	
	//判断 n 是否为偶数,且大于3
	if (n<4 || n%2!=0)                  //或者n % 2 == 1; 但不要写成赋值 = 
	{
		printf("Input data error!\n");  //提示输入错误 
		exit(-1);                       //程序结束。添加 #include<stdlib.h> 
	 } 
	
    //判断 p,q 是否是素数 
	do{
		p++;                           //此时 p 从 2 开始循环
		q = n-p;
		
		flagp = 1;                   //假设 p 是素数 
		//判断 p 是否为素数
		for (j=2; j <= sqrt(p); j++)    //sqrt();函数是求一个数的平方根,添加 #include<math.h>
		  {
		  	if(0 == p % j)           //素数的因数只有 1 和它本身 
		  	{
		  		flagp = 0;           //不是素数,改变 flagp 的值  
		  		break;               //退出 for 循环 
			}    
		  }
		  
		flagq = 1;
	    //判断 q 是否为素数
		for (j=2; j <= sqrt(q); j++)     
		 {
		  	if(0 == q % j)     
		   /*不写成 q % j == 0; 是因为 0 == q % j 中,如果 == 写成 = ,会变成bug,可以报错*/
		  	{
		  		flagq = 0;
		  		break;
		    }   
		  }
	} while(flagq * flagp == 0);   //首先 flag = 1,否则 do while 循环无法结束 
    
    //输出 n, p. q
    printf("   n   =   p  +   q\n");
	printf("%4d   =%4d  +%4d\n", n, p, q);
	
	return 0; 
}

下面进行编程时的错误总结:

(1)一开始令 flagq 和 flagq 等于0,然后 q,p 不为素数时,flag = 1;
因为while(flagq * flagp == 0);所以如果两个数为素数,循环还会继续,无法退出循环。
正确的写法:先 flag = 1; 若不是素数,则 flag = 0;只要 p,q 中有一个不是素数,则循环继续。

(2)一开始令 p = 0;
那么输入 8,会得到 8 = 1 + 7,然而 1 不是质数(素数)。
质数的定义:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。
正确的写法:p = 1;

判断素数的代码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
	int i, n;       // i 为循环所用, n 为一个数
	int flag, j;    //flag 判断是否为素数 , j 为输入 n 的次数 
	
	printf("Input an integer:");    //提示输入 n 
	scanf("%d", &n);                //输入 n
	
	// n 要大于 1,且如果输错 3次以上,程序结束
	j = 0;
	while (n<2)
	{
		j++;
		if(j>2) 
		{
			printf("输入错误超过上限,程序结束!\n");
			exit(-1);
		}
		printf("Input data error!\n");
		printf("Input another integer:");
		scanf("%d", &n);
	
	 } 
	 
	//判断 n 是否为素数
	flag = 1;
	for (i=2; i <= sqrt(n); i++) 
	{
		if(0 == n % i)
		{
			printf("This is not prime.\n");
			flag = 0;
			break;
		}
	}
	if (flag == 1)
	   printf("This is prime.\n");
	    
	return 0;
}
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值