验证 一个空格 i++ -s define while char pac algorithm
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。
这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。
从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。
现在请你编一个程序验证哥德巴赫猜想。
先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数。
输入格式:
仅有一行,包含一个正奇数n,其中9<n<20000
输出格式:
仅有一行,输出3个质数,这3个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个质数最小的方案,如果第一个质数最小的方案不唯一,请输出第一个质数最小的同时,第二个质数最小的方案。
- 2009
- 3 3 2003
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define N 30010
- using namespace std;
- bool not_prime[N];
- int n,tot,prime[N];
- int read()
- {
- int x=0,f=1; char ch=getchar();
- while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
- while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
- return x*f;
- }
- int Euler_sieve()
- {
- not_prime[1]=1;
- for(int i=2;i<=n;i++)
- {
- if(!not_prime[i]) prime[++tot]=i;
- for(int j=1;j<=tot;j++)
- {
- if(prime[j]*i>n) break;
- not_prime[i*prime[j]]=true;
- if(i%prime[j]==0) break;
- }
- }
- }
- int main()
- {
- n=read();
- Euler_sieve();
- for(int a=1;a<=n/3;a++)
- if(!not_prime[a])
- for(int b=1;b<=n/3;b++)
- if(!not_prime[b])
- if(!not_prime[n-a-b])
- {
- printf("%d %d %d",a,b,n-a-b);
- return 0;
- }
- }
洛谷——P1579 哥德巴赫猜想(升级版)
验证 一个空格 i++ -s define while char pac algorithm
原文:http://www.cnblogs.com/z360/p/7853657.html
来源: http://www.bubuko.com/infodetail-2398893.html