OK now 每日一题来了哦
今天题目是Online Judge(OJ)编号为1878的哥德巴赫猜想
现在让我们一起来see see 题目
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:
任何一个大于9的奇数都可以表示成3个质数之和。
质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。
需要特别说明的是
1不是质数。这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。
输入
仅有一行,包含一个正奇数n,其中n大于9并且小于10000。
输出
仅有一行,输出3个质数,这3个质数之和等于输入的奇数。
相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。
如果表示方法不唯一,请输出第一个数最小的方案,如果第一个数最小的方案不唯一,请输出第二个数最小的方案。
样例
输入 2009
输出 3 3 2003
思路走起
本题就是质数函数加上枚举
这道题就易如反掌
代码来哦
随便先写一个判断质数函数
int f(int n){
bool f=true;
if(n==1)f=false;
for(int i=2;i<n;i++)
{
if(n%i==0)f=false;
}
return f;
}
okk
枚举走一个
for(int i=1;i<=n/3;i++)
{
for(int j=1;j<=(n-i)/2;j++)
{
int k=n-i-j;
}
}
这边使用双重循环主要怕超时
判断已经可以走了
if(f(i)==1&&f(j)==1&&f(k)==1&&k>0&&i<=j&&i<=k&&j<=k)
{
cout<<i<<" "<<j<<" "<<k<<endl;
break;
}
可是这样外循环就不能退出了
所以用一个变量来记录就行了
然后在外循环判断一下就行了
具体怎么做看下面
废话不多说全部代码起
#include<bits/stdc++.h>
using namespace std;
int f(int n){
bool f=true;
if(n==1)f=false;
for(int i=2;i<n;i++)
{
if(n%i==0)f=false;
}
return f;
}
int n,s=0,k1=0;
int main(){
cin>>n;
for(int i=1;i<=n/3;i++)
{
for(int j=1;j<=(n-i)/2;j++)
{
int k=n-i-j;
if(f(i)==1&&f(j)==1&&f(k)==1&&k>0&&i<=j&&i<=k&&j<=k)
{
k1=1;
cout<<i<<" "<<j<<" "<<k<<endl;
break;
}
}
if(k1==1)break;
}
return 0;
}