C语言验证哥德巴赫猜想

问题描述】验证哥德巴赫猜想:任意充分大的偶数,可以用两个素数之和表示。
【输入形式】一个大于2的偶数,以回车结束
【输出形式】每行一对素数,小的素数在前,以空格隔开,多组用多行表示,小的素数在前;
【样例输入】
10
【样例输出】
3 7
【样例输入】
20
【样例输出】
3 17
7 13
老哥们实在做不出来了。。。我做的都不对 初学C语言 这个该用哪个循环啊?

include <math.h>

include <stdio.h>

main( )
{
long int j,n,p,q,flagp,flagq;
printf("please input n :n");
scanf("%ld",&n );
if (((n%2)!=0)||(n<=4))

printf("input data error!\n");

else
{

 p = 1 ;
 do {
      p = p + 1 ;
      q = n - p ;
      flagp = 1 ;
      for(j=2;j<=(int)(sqrt(p));j++)  
        {
           if ((p%j)==0)
           {
             flagp = 0 ;
             break;      
            }
          }
     flagq=1 ;
     for(j=2;j<=(int)(sqrt(q));j++)  

       {
         if ((q%j)==0)
         {
           flagq = 0 ;
           break ; 
          }
       }
 } while(flagp*flagq==0);

printf(“%d %d”,p,q) ;
}
我的代码不对。。真心求教各位老哥!

阅读 7.7k
1 个回答

你好,用几个Sample Input试了一下你提供的代码,都可以得出一组正确答案,代码的问题在于不能输出全部符合猜想的数字组合,下面做出说明:

#include <math.h>
#include <stdio.h>
 int main( )
{
long int j,n,p,q,flagp,flagq;//定义整型即可满足题意
printf("please input n :");
scanf("%ld",&n );
if (((n%2)!=0)||(n<=4))
printf("input data error!\n");
else
{ p=1;
 do {
      p=p+1;
      q=n-p;
      flagp=1;
      for(j=2;j<=(int)(sqrt(p));j++)  
        {
           if ((p%j)==0)
           {
             flagp=0;
             break;      
            }
          }
     flagq=1;
     for(j=2;j<=(int)(sqrt(q));j++) 

       {
         if(q%j==0)
         {
           flagq=0;
           break; 
          }
       }
 /*此处没有必要运用两组for循环分别判断是否满足素数,
当第一个数p不满足素数时,仍对原有的q进行了不必要的判断,冗杂繁复,
将两个数的素数判断都置于一个for循环中即可*/
 } while(flagp*flagq==0);
//当有一组数字满足条件时,flagp*flagq==1,即跳出while循环,无法输出所有组合

printf("%d %d\n",p,q);
}
return 0;
} 

现给出修改建议

#include <stdio.h> 
#include <math.h> 
int sushu(int x) //定义一个函数,判断一个数是否是素数
{
      int flag=0,a,i; 
      a=(int)sqrt(x); 
for(i=2;i<=a;i++) {
 if(x%i==0) 
    flag=1; 
} 
return flag; 
} //如果是素数,函数返回值为0,非素数返回值为1
int main()
{
int n,i,j,num1,num2;//n为输入的偶数,i,j为参与循环测试的数,num1,num2为判断是否满足条件的参数
printf("please input n :");
scanf("%ld",&n );
if (((n%2)!=0)||(n<=4))
printf("input data error!\n");
else
{
   for(i=3;i<=n/2;i=i+2)//循环至 n/2即可,满足输出时小的素数在前(从最小的素数3开始循环)
  {  
     num1=0; 
     num2=0; 
     num1=sushu(i); //调用函数给参数赋值
     if(num1==0) //第一个数满足素数条件时,进行第二个数的素数判断
       { 
          j=n-i; 
          num2=sushu(j); 
       } 
       if(num1==0 && num2==0)//两个数都满足素数,即输出一组数
       printf("%d %d\n",i,j); 
  } 
} 
return 0;
}

望采纳,欢迎追问~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进