题目背景 Background
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。 这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。 从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。
题目描述 Description
现在请你编一个程序验证哥德巴赫猜想。
先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数。
先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数。
输入输出格式 Input/output
输入格式:
仅有一行,包含一个正奇数n,其中9<n<20000
输出格式:
仅有一行,输出3个质数,这3个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个数最小的方案,如果第一个数最小的方案不唯一,请输出第二个数最小的方案。
仅有一行,包含一个正奇数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 ",i,j,n-i-j); 23 return 0; 24 } 25 } 26 } 27 }