注册 登录
编程论坛 C语言论坛

哥德巴赫猜想,函数体问题,我想借助函数自调用来处理求两个合适的素数,但是陷入死循环,不知道怎么改进,提供其他方法思想也可以的,上面是题目,下面是我写的代码

加冕 发布于 2018-12-07 21:09, 1767 次点击
任何大于等于6的偶数均可表示成两个素数之和,例如6=3+3,8=3+5等,这就是著名的哥德巴赫猜想。现有多个整数,请找出这样的偶数及其素数和表示。输入有多组测试数据,输入数据为整数,且输入数据为0时结束测试
输出分以下几种情况:

1)n>=6的偶数,直接输出素数和表示,多组结果取第一个素数为最小的一组。

2)n>0且n<6的数,直接输出“n is smaller than 6!”

3)  n>6的奇数,直接输出“n is an odd number!”

4)  n<0的数,直接输出“n is a negative number!”
输入   
6
8
15
10
-5
4
12
0
输出
6=3+3
8=3+5
15 is an odd number!
10=3+7
-5 is a negative number!
4 is smaller than 6!
12=5+7






#include<stdio.h>
int s1,s2;
extern  s1,s2;  
 find(int n)
{
     int i,j;
    for(i=3;i<n;i++)
    {
          for(j=2;j<i;j++)
          {
               if(i%j==0) break;
          }
          if(j>=i)
        s1=i;
          break;
         
    }

   s2=n-s1;
   for(j=2;j<s2;j++)
          {
               if(s2%j==0)
               {
                   s1=s1+2;
                   find(n);
               }
          }
         
           
  return 0;
}

main()
{
    int n;
    while(scanf("%d",&n)!=EOF,n)
        {
        
        if(n>=6&&n%2==0)
        {    find(n);
        printf("%d=%d+%d\n",n,s1,s2);}
            else if(n>0&&n<6)   
            { printf("%d is smaller than 6!\n",n);}
            else if(n>6&&n%2!=0)
            {
                printf("%d is an odd number!\n",n);}
             else if(n<0)
             { printf("%d is a negative number!\n",n);}
        }
        
 
}

[此贴子已经被作者于2018-12-7 21:10编辑过]

2 回复
#2
莱布尼茨2018-12-08 20:58
程序代码:
#include<stdio.h>
int s1=3,s2,k=0;

find(int n)
{
     int i,j;
    for(i=s1;i<n;i+=2)
    {
          for(j=2;j<i;j++)
          {
               if(i%j==0)

               {
                       k=1;
                       break;
               }
            }
        if(k==0)
        {
            s1=i;
            break;
        }
         

         

        

    }

   s2=n-s1;
   for(j=2;j<s2;j++)
{
           if(s2%j==0)
               {
                   s1=s1+2;
                   k=0;
                   find(n);
               }
}
         

  return 0;
}
[local]1[/local]
改动都在上面,经测试符合题意。如果觉得有什么问题,再问我。


#3
C基础2018-12-09 00:03
你的程序我没看,下面是我根据题目编出来的,我看你递归都能编出来,相信我的程序你也是可以看懂的,其他的都不用我说,我的主要思路是找到2到n之间的所有素数放在一个数组中,然后对这个素数组中的元素遍历相加,需要注意的就是在遍历相加的时候,内循环的变量要在外循环的变量的基础上接着加下去,这样恰好就可以满足你题目中“多组结果取第一个素数最小的一组”的要求,在题目中我给你标注出来了,希望对你有所帮助
#include "stdio.h"
int main()
{
    void fun(int t);
    int a[1000],i,j,m,q,r=0;
    for(i=0;i<1000;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]==0)break;
    }
    m=i;
    for(i=0;i<m;i++)
    {
        if(a[i]>0&&a[i]<6)printf("%d is smaller than 6!\n",a[i]);
        if(a[i]>6&&a[i]%3==0)printf("%d is an odd number\n",a[i]);
        if(a[i]<0)printf("%d is a negative number!\n",a[i]);
        if((a[i]>=6)&&(a[i]%2==0))fun(a[i]);
    }
return 0;
}

void fun(int t)
{
    int b[100],m=0,i,j;
    for(i=0;i<=t;i++)
    {
        for(j=2;j<i;j++)
        if(i%j==0)break;
        if(j==i){b[m]=i;m++;}
    }
   
    int flag=0;
    for(i=0;i<m;i++)
    {
        for(j=i;j<m;j++)//j是从i开始向下遍历数组,不用从0开始,恰好满足题目要求是多组结果中取第一个素数为最小的一组
        if(b[i]+b[j]==t){printf("%d=%d+%d\t\n",t,b[i],b[j]);flag=1;}
        if(flag==1)break;
    }
}

1