问题:
把一个给出的整数写成四个素数之和。
输入
输入每一行都有一个整数n(n≤10000 000)。
输出
对于输入的每个数n,输出一行,包含和为n的四个素数。如果n不能写成4个素数
之和,则在单独的一行输出“Impossible.”。如果有多种解法,输出任意一种即可。
解决代码:
#include<iostream>
#include<cmath>
int judge();
int judge(unsigned long int x)
{
int k;
if (x == 2)
return 1;
if (x % 2 == 0)
return 0;
for (k = 2; k <= sqrt(x); k++)
{
if (x % k == 0)
return 0;
}
return 1;
}
int main()
{
int num1, num2, i;
int r1, r2;
while (scanf_s("%ld", &num1) && num1 != 0)
{
if (num1 >= 8)
{
if (num1 % 2 == 0)
{
num2 = num1 - 4;
}
else
{
num2 = num1 - 5;
}
for (i = 2; i <= num2; i++)
{
r1 = judge(i);
if (r1 != 0)
{
r2 = judge(num2 - i);
if (r2 != 0) break;
}
}
if (num1 % 2 == 1) printf("2 3 %ld %ld\n", i, num2 - i);
else printf("2 2 %ld %ld\n", i, num2 - i);
}
else printf("Impossible\n");
}
}
哪位可以细致地讲解一下这份参考源码 本人略知一二 但还是很不明了 请各位指点
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
原理,哥德巴赫猜想:任一大于2的偶数都可写成两个素数之和
四个素数就是个幌子……本质上还是找两个素数使得和为输入处理后的偶数,用的还是最粗暴的遍历,正确性建立在歌猜正确或是其他人的验证正确的基础上……