OK now 每日一题来了哦
今天题目是Online Judge(OJ)编号为1273的哥德巴赫猜想的所有解
现在让我们一起来see see 题目
以下为哥德巴赫猜想简介
(1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:
任何一个大于9的奇数都可以表示成3个质数之和。
质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。
需要特别说明的是
1不是质数。这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。
)
下面才是真正的题目
求出哥德巴赫猜想的所有解(将一个大于9的奇数拆分成三个素数之和),并按从小到大的顺序写出。
输入
一行,一个大于 9的奇数。
输出
第一行,一个整数 N(N≤1200),表示解的总数。
第2-N+1行,每行一个解。
样例
输入 15
输出
3
15=2+2+11
15=3+5+7
15=5+5+5
oj原本让我用二维数组,但我一身反骨,偏不用。
接下来让我一起see see思路吧
本题就是质数函数加上枚举,然后再从小到大输出来
这道题就易如反掌
代码来哦
随便先写一个判断质数函数
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)
{
s++;
}
这边可以用数组存起来因为后面要输出但我用简单易懂的方法
用两个循环就可以了
具体怎么做看下面
废话不多说全部代码起
#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;
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)
{
s++;
}
}
}
cout<<s<<endl;
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<<n<<"="<<i<<"+"<<j<<"+"<<k<<endl;
}
}
}
return 0;
}
标签:15,OJ,哥德巴赫猜想,int,质数,1273,see,&&,Online
From: https://blog.csdn.net/hjxxhesenyu/article/details/144094549