题目描述
输入一个偶数 N,验证 4∼N 所有偶数是否符合哥德巴赫猜想:任一大于 2 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10,10=3+7=5+5,则 10=5+5 是错误答案。
输入格式
第一行输入一个正偶数 N
输出格式
输出(n-2)/ 2行。对于第 i行:
首先先输出正偶数 2i+2,然后输出等号,再输出加和为 2i+2 且第一个加数最小的两个质数,以加号隔开。
输入输出样例
输入 #1
10
输出 #1
4=2+2 6=3+3 8=3+5 10=3+7
说明/提示
数据保证,4≤𝑁≤10000。
思路:
先定义一个判断质数的函数,再定义一个函数,里面从2枚举到n,如果两个都是质数就输出,然后return
AC代码:
#include<bits/stdc++.h>//万能头文件
using namespace std;//cin,cout必备
bool isPrime(int n)//判断质数的函数
{
for(int i=2;i<=n/i;i++)//从2枚举到根号n
{
if(n%i==0)//如果能整除
{
return 0;//不是质数
}
}
return n>=2;//注意小于2的都不是质数
}
void f(int n)//递归函数
{
for(int i=2;i<=n;i++)//从2枚举到n
{
if(isPrime(i)&&isPrime(n-i))//两个数都是质数
{
cout<<n<<"="<<i<<"+"<<n-i<<endl;//按照题目格式输出
return;//结束程序,否则会错
}
}
}
int main()//main主函数
{
int n;//定义变量
cin >> n;//读入
for(int i=4;i<=n;i+=2)//注意是4~n的双数,所以从4开始,每次+2
{
f(i);//调用函数
}
return 0;//程序结束
}
这里再提供另一种代码:
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n)
{
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
{
return 0;
}
}
return n>=2;
}
int main()
{
int n;
cin >> n;
for(int i=4;i<=n;i+=2)
{
for(int j=2;j<=i;j++)
{
if(isPrime(j)&&isPrime(i-j))
{
cout<<i<<"="<<j<<"+"<<i-j<<endl;
break;
}
}
}
return 0;
}
其实这2份代码本质是一样的,就是一个有2个函数,一个有1个而已,不过多一点没有坏处,对吧?
这篇博客就到这里啦,作者非常辛苦,麻烦点个赞,谢谢!