哥德巴赫猜想(升级版)

题目背景 Background
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。 这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。 从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。
 题目描述 Description
现在请你编一个程序验证哥德巴赫猜想。
    先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数。
 输入输出格式 Input/output
输入格式:
仅有一行,包含一个正奇数n,其中9<n<20000
输出格式:
仅有一行,输出3个质数,这3个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个数最小的方案,如果第一个数最小的方案不唯一,请输出第二个数最小的方案。
 输入输出样例 Sample input/output
样例测试点#1
输入样例:
2009
输出样例:
3 3 2003
思路:先从小到大,寻找第一个质数,找到了,从这个质数开始寻找第二个质数,找到的话,直接输出即可(第三个数就是n-i-j)
代码如下:
 1 #include <stdio.h>    
 2 #include <math.h>     
 3 int pri(int a)  //判断质数
 4 {    
 5     for(int i=2;i<=sqrt(a);i++)
 6     {
 7         if(a%i==0) return 1;//找到了,返回1    
 8     }    
 9     return 0;//否则返回0    
10 }    
11 int main()    
12 {    
13     int n,a,b,c;    
14     scanf("%d",&n);   
15     for(int i=2;i<n;i++)//找到第一个数  
16     {    
17         if(pri(i)==0) 
18         for(int j=2;j<n-i;j++)//判断第一个数是否为质数,如果是,寻找第二个数  
19         {    
20             if(pri(j)==0&&pri(n-i-j)==0) //找到2个数自然确定了第三个数 ,并判断第二和第三个数为质数 
21             {
22                 printf("%d %d %d\n",i,j,n-i-j);
23                 return 0;
24             }    
25         }    
26     }    
27 }

 

posted @ 2015-05-01 22:18  Memoryヾノ战心  阅读(319)  评论(0编辑  收藏  举报