题目描述
输入一个偶数 N,验证 4∼N 所有偶数是否符合哥德巴赫猜想:任一大于 2 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。
例如 10=3+7、10=5+5,则 10=5+5 是错误答案。
输入格式
第一行输入一个正偶数 N
输出格式
输出 行。对于第 i 行:
首先先输出正偶数 2i+2,然后输出等号,再输出和为 2i+2 且第一个加数最小的两个质数,以加号隔开。
输入输出样例
输入 #1
10
输出 #1
4=2+2 6=3+3 8=3+5 10=3+7
说明/提示
数据保证,4≤N≤10000。
编写程序
先写主函数部分,通过两次循环,并调用自行编写的判断函数,打印每一个偶数的加数等式
代码如下:
int main()//主函数
{
int N, i, j,a,b;
scanf("%d", &N);//输入范围
for (i = 4; i <= N; i = i + 2)//遍历4至N的每一个偶数
{
a = 0;//用于接收判断函数的返回值
b = 0;//用于接收判断函数的返回值
for (j = 2; j + j <= i; j++)//对每一个偶数,遍历2至i/2的每一个数
{
a=judge(j);//通过判断函数查找质数
if (a == 1)//一旦找到第一个
{
b = judge(i - j);//立刻通过判断函数判断i-b(即另一个加数)是否也为质数)0
if (b == 1)//若是,则为正确答案
{
printf("%d=%d+%d\n", i, j, i - j);//打印
break;//跳出这个偶数循环
}
}
}
}
return 0;
}
整体思路正确,下面编写判断函数judge()
代码如下:
int judge(int x)//编写判断质数函数
{
int i, a=1;//首先假设传进函数内的数x是质数
for (i = 2; i * i <= x; i++)//遍历2至根号x内所有整数,判断是否有x的因子
{
if (x % i == 0)
{
a = 0;//若有因子,则另a为0
break;//只要找到一个,立刻跳出循环
}
}
if (a == 1)//在判断函数的末尾检查a的值,若原假设的1未改变,则是质数,函数返回值为1
return 1;
else//若改变,则不是质数,函数返回值为0
return 0;
}
最终通过调试运行,并提交洛谷OJ判定正确。
完整代码如下:
#define _CRT_SECURE_NO_WARNINGS//vs编辑器scanf安全声明
#include <stdio.h>//包含标准输入输出头文件
int judge(int x)//编写判断质数函数
{
int i, a=1;//首先假设传进函数内的数x是质数
for (i = 2; i * i <= x; i++)//遍历2至根号x内所有整数,判断是否有x的因子
{
if (x % i == 0)
{
a = 0;//若有因子,则另a为0
break;//只要找到一个,立刻跳出循环
}
}
if (a == 1)//在判断函数的末尾检查a的值,若原假设的1未改变,则是质数,函数返回值为1
return 1;
else//若改变,则不是质数,函数返回值为0
return 0;
}
int main()//主函数
{
int N, i, j,a,b;
scanf("%d", &N);//输入范围
for (i = 4; i <= N; i = i + 2)//遍历4至N的每一个偶数
{
a = 0;//用于接收判断函数的返回值
b = 0;//用于接收判断函数的返回值
for (j = 2; j + j <= i; j++)//对每一个偶数,遍历2至i/2的每一个数
{
a=judge(j);//通过判断函数查找质数
if (a == 1)//一旦找到第一个
{
b = judge(i - j);//立刻通过判断函数判断i-b(即另一个加数)是否也为质数)0
if (b == 1)//若是,则为正确答案
{
printf("%d=%d+%d\n", i, j, i - j);//打印
break;//跳出这个偶数循环
}
}
}
}
return 0;
}
以上就是洛谷P1304哥德巴赫猜想的题解,由于本人提供的只是最最简单的基础思路,如有大佬们有更好的算法思路,欢迎多多指导~
&spm=1001.2101.3001.5002&articleId=143669725&d=1&t=3&u=6093d4bd11344688993418f083bb7925)
564

被折叠的 条评论
为什么被折叠?



