| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9210 人关注过本帖, 3 人收藏
标题:编程验证哥德巴赫猜想
只看楼主 加入收藏
Aamir
Rank: 2
来 自:厦门
等 级:论坛游民
帖 子:18
专家分:30
注 册:2011-2-23
结帖率:100%
收藏(3)
已结贴  问题点数:20 回复次数:7 
编程验证哥德巴赫猜想
题目:哥德巴赫猜想可以分为两个猜想: 1.每个不小于6的偶数都是两个奇素数之和; 2.每个不小于9的奇数都是三个奇素数之和。
如:6 = 3 + 3,
       8 = 3 + 5,
       10 = 5 + 5 = 3 + 7,
       77=53+17+7;
编程实现:
1、从键盘输入一个正整数n(n<65535),若输入的是不小于6的偶数,按照猜想1将其分解;若输入的是不小于9的奇数,按照猜想2将其分解;若有多种表示方式,将它们都表示出来,如10的分解有两种。若输入的数不符合要求,给出提示。

以下是我编的程序:
#include<stdio.h>
#include<math.h>

unsigned int n;
void main()
{
    unsigned int a,c=1;
    int isprime(int b);
    unsigned int eve[3]={0};
    unsigned int odd[4]={0};
    unsigned int spilt_eve(unsigned int array[3]);
    unsigned int spilt_odd(unsigned int array[4]);
    /*input number*/
    for(;;)
    {
        printf("Please input a number.(0 ~ 65535)\n");
        scanf("%d",&a);
        if((a%2==0)&&(a<6))
            printf("if the number is even number, please make sure that it is beyond 6.\n");
        else if((a%2!=0)&&(a<9))
            printf("if the number is odd number, please make sure that it's beyond 9.\n");
        break;
    }

    /*distinguish number and put the equotion out.*/
    if(a%2==0)
    {
        eve[0]=a;
        for(n=3;n<(unsigned int)a/2;n++)
        {
        spilt_eve(eve);   
        if(eve[1]>=n)
        printf("%d=%d+%d\n",eve[0],eve[1],eve[2]);
        }
    }
    else
    {
        odd[0]=a;
        for(n=3;n<(unsigned int)a/2;n++)
        {
        spilt_odd(odd);   
        if(odd[1]>=n)
        printf("%d=%d+%d+%d\n",odd[0],odd[1],odd[2],odd[3]);
        }
    }
        
}

/*make sure the number is prime or not.*/
int isprime(int x)
{
    int i,y=1;
    for(i=2;i<=(int)sqrt(x);i++)
    {
        if(x%i==0)
        {
            y=0;
            break;
        }        
    }
    return(y);
}

/*split the even number.*/
unsigned int spilt_eve(unsigned int eve[3])
{
    int i,m;
    i=eve[0];
    for(m=n;m<=i/2;m++)
    {
        if(isprime(m)==1)
        {
            if((isprime(i-m==1))&&((i-m)>=3))
            {
                eve[1]=m;
                eve[2]=i-m;
                break;
            }
        }
    }
}

/*split the odd number.*/
unsigned int spilt_odd(unsigned int odd[4])
{
    unsigned int eve[3];
    int i,j,k;
    i=odd[0];
    for(k=n;k<=i/2;k++)
    {
        if(isprime(k)==1)
        {
            j=i-k;
            if(j%2==0)
            {
                eve[0]=j;
                spilt_eve(eve);
                odd[1]=k;
                odd[2]=eve[1];
                odd[3]=eve[2];
                break;
            }
        }
    }
}

结果不对,会出现数据溢出的结果,但我没发现问题在哪里,请教一下大家。另外,如果您有更好的办法,在对我的程序作出了修改之后,麻烦给我一个思路或者指导。谢谢。
搜索更多相关主题的帖子: 哥德巴赫 正整数 
2011-04-14 22:43
唯我独魔
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:176
专家分:782
注 册:2011-4-13
收藏
得分:15 
回复 楼主 Aamir
按照你的要求循环输入,当输入0时退出,然后你的77表达应该有多种形式,下面是程序代码
#include<stdio.h>
#include<math.h>
void main()
{
    unsigned int a=1,c=1;
    int isprime(int b);
    unsigned int eve[3]={0};
    unsigned int odd[4]={0};
    void spilt_eve(unsigned int array[]);
   void spilt_odd(unsigned int array[]);
    /*input number*/
    for(;a!=0;)
    {
        printf("Please input a number.(0 ~ 65535)\n");
        scanf("%d",&a);
        if((a%2==0)&&(a<6))
        {
            printf("if the number is even number, please make sure that it is beyond 6.\n");
            continue;
        }
        else if((a%2!=0)&&(a<9))
        {
            printf("if the number is odd number, please make sure that it's beyond 9.\n");
            continue;
        }
  
    /*distinguish number and put the equotion out.*/
    if(a%2==0)
    {
        eve[0]=a;
        spilt_eve(eve);   
        
        }

    else
    {
        odd[0]=a;
       spilt_odd(odd);   
      
        }
 
        
}
}

/*make sure the number is prime or not.*/
int isprime(int x)
{
    int i,y=1;
    for(i=2;i<=(int)sqrt(x);i++)
    {
        if(x%i==0)
        {
            y=0;
            break;
        }        
    }
    return(y);
}

/*split the even number.*/
void spilt_eve(unsigned int eve[3])
{
    int i,m;
    i=eve[0];
    for(m=3;m<=i/2;m++)
    {
        if(isprime(m)==1)
        {
            if((isprime(i-m==1)))
            {
                eve[1]=m;
                eve[2]=i-m;
              printf("%d=%d+%d\n",eve[0],eve[1],eve[2]) ;
            }
        }
    }
}

/*split the odd number.*/
void spilt_odd(unsigned int odd[4])
{
    unsigned int eve[3];
    int i,j,k;
    i=odd[0];
    for(k=3;k<=i/3;k++)
    {
        if(isprime(k)==1)
        {
            for(j=k;j<=i/2;j++)
            {
                if(isprime(j)==1)
                {
                 if(isprime(i-k-j)==1&&((i-k-j)>=j))
                 {
           
                odd[1]=k;
                odd[2]=j;
                odd[3]=i-k-j;
             printf("%d=%d+%d+%d\n",odd[0],odd[1],odd[2],odd[3]);
            }
        }
    }
}
    }
    }
2011-04-15 08:34
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
前一阵子有人问过这个:
https://bbs.bccn.net/viewthread.php?tid=332857
2011-04-15 08:46
mandown1991
Rank: 4
等 级:业余侠客
帖 子:262
专家分:252
注 册:2011-3-2
收藏
得分:0 
收藏了!
2011-04-15 09:05
Aamir
Rank: 2
来 自:厦门
等 级:论坛游民
帖 子:18
专家分:30
注 册:2011-2-23
收藏
得分:0 
回复 2楼 唯我独魔
非常感谢,明白了。
2011-04-15 12:29
Aamir
Rank: 2
来 自:厦门
等 级:论坛游民
帖 子:18
专家分:30
注 册:2011-2-23
收藏
得分:0 
回复 3楼 pangding
谢啦。
2011-04-15 12:30
cxinshou999
Rank: 1
来 自:南京
等 级:新手上路
帖 子:15
专家分:3
注 册:2011-4-15
收藏
得分:0 
顶楼主   在学习  c语言学习群60176178
2011-04-15 12:47
redunkind
Rank: 2
等 级:论坛游民
帖 子:36
专家分:14
注 册:2011-4-10
收藏
得分:0 
我想问的是后面的三重的时候13为什么不表示1+1+11。。。这样还有很多种可以表示的。为什么只表示3+5+5和3+3+7???求解释
2011-07-12 12:14
快速回复:编程验证哥德巴赫猜想
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059309 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved