pascal编程:哥德巴赫猜想(升级版)
来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/11/10 21:58:18
pascal编程:哥德巴赫猜想(升级版)
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3.需要特别说明的是1不是质数.
这就是哥德巴赫猜想.欧拉在回信中说,他相信这个猜想是正确的,但他不能证明.
从此,这道数学难题引起了几乎所有数学家的注意.哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”.
现在请你编一个程序验证哥德巴赫猜想.
先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数.
输入格式
仅有一行,包含一个正奇数n,其中9
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3.需要特别说明的是1不是质数.
这就是哥德巴赫猜想.欧拉在回信中说,他相信这个猜想是正确的,但他不能证明.
从此,这道数学难题引起了几乎所有数学家的注意.哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”.
现在请你编一个程序验证哥德巴赫猜想.
先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数.
输入格式
仅有一行,包含一个正奇数n,其中9
由于“n大于9并且小于10000”,用朴素算法应该也不会超时.
这里提供一种优化的算法:先构造2~10000以内的质数表,并除去其中的2,就能得到3~10000以内的奇质数表;
令 i 从 3开始循环(这是外循环),j 从3开始循环(这是内循环),然后判断(n-i-j)是不是质数,如果是,就 writeln(i,' ',j,' 'n-i-j).
完整代码如下:
program Goldbach;
var prime:array[2..10000]of boolean;
i,j,n:longint;
begin
readln(n);
for i:=2 to trunc(sqrt(n)) do
if not prime[i] then
begin
for j:=2 to n div i do
prime[i*j]:=true;
end;
for i:=3 to n do
if not prime[i] then
for j:=3 to n do
if not prime[j] then
if not prime[n-i-j] then
begin
writeln(i,' ',j,' ',n-i-j);
exit;
end;
end.
真的不长吧?最大的数9999也不用1秒.
筛法求素数是一个很常用的算法,请LZ一定要掌握.
祝学习进步.我不会 这个语言,所以帮你百度上找到的,如果c语言,还行
http://zhidao.baidu.com/question/553416068.html 来源
这里提供一种优化的算法:先构造2~10000以内的质数表,并除去其中的2,就能得到3~10000以内的奇质数表;
令 i 从 3开始循环(这是外循环),j 从3开始循环(这是内循环),然后判断(n-i-j)是不是质数,如果是,就 writeln(i,' ',j,' 'n-i-j).
完整代码如下:
program Goldbach;
var prime:array[2..10000]of boolean;
i,j,n:longint;
begin
readln(n);
for i:=2 to trunc(sqrt(n)) do
if not prime[i] then
begin
for j:=2 to n div i do
prime[i*j]:=true;
end;
for i:=3 to n do
if not prime[i] then
for j:=3 to n do
if not prime[j] then
if not prime[n-i-j] then
begin
writeln(i,' ',j,' ',n-i-j);
exit;
end;
end.
真的不长吧?最大的数9999也不用1秒.
筛法求素数是一个很常用的算法,请LZ一定要掌握.
祝学习进步.我不会 这个语言,所以帮你百度上找到的,如果c语言,还行
http://zhidao.baidu.com/question/553416068.html 来源