每日一题Online Judge(oj)哥德巴赫猜想

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;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值