主题:[讨论]歌德巴赫的猜想--
张扬SKY
[专家分:20] 发布于 2007-08-10 20:42:00
按歌德巴赫的猜想,一个大于5的偶数可以表示为两个素数之和,编写函数,对m和n之间的所有偶数用两个素数表示.
Do
Input m,n
if m> n then swap m,n
Loop Until m>5
if m mod 2<>0 then m=m+1
if n mod 2<>o then n=n-1
for i=m to n step 2
call ss(i)
next i
END
sub ss(m)
a=2
f=1
do while f=1
if isprime(a) and isprime(m-a)then
print m;"=":a"+"m-a
f=0
end if
a=a+1
Loop
end sub
function isprime (a)
for i =2 to SQR(a)
if a mod i =0 then
isprime =0
exit function
end if
next i
isprime =1
end function
讨论有没有更简便的方法啊!!!
这是我们老师总结的!!!!
回复列表 (共4个回复)
沙发
Matodied [专家分:7560] 发布于 2007-08-10 21:19:00
其实这题还有别的方法:
(1)找出3到n-2之间所有的素数。
(2)把所有素数两两相加,假设素数k1和k2的(有三个数组,a(n)表示偶数n是不是已经拆成2个素数的和了,b(n)和c(n)存放素数)和为s,并且s在m到n范围内,则令a(s)=1,b(s)=k1,c(s)=k2。
(3)输出。
比如m=10, n=16。
(1)3到14的素数有3、5、7、11、13。
(2)把素数两两相加。
3 + 3 = 6,6不在10到16范围内,舍弃。
3 + 5 = 8,8不在10到16范围内,舍弃。
3 + 7 = 10,令a(10)=1,b(10)=3,c(10)=7。
3 + 11 = 14,令a(14)=1,b(14)=3,c(14)=11。
3 + 13 = 16,令a(16)=1,b(16)=3,c(16)=13。
5 + 5 = 10,令a(10)=1,b(10)=5,c(10)=5。
5 + 7 = 12,令a(12)=1,b(12)=5,c(12)=7。
5 + 11 = 16,令a(16)=1,b(16)=5,c(16)=11。
5 + 13 = 18,18不在10到16范围内,舍弃。
7 + 11 = 18,18不在10到16范围内,舍弃。
7 + 13 = 20,20不在10到16范围内,舍弃。
11 + 13 = 24,24不在10到16范围内,舍弃。
这样的方法有一个致命的缺点:在给a(s)赋值的时候,如果a(s)已经等于1了,即前面的和为s的两个素数已经找到了,a(s)也还要被重新赋值,如果m和n较大,会浪费很多时间。克服这个缺点的办法是:在每次赋值的时候,如果a(s)已经为1,就不需要赋值了。
板凳
moz [专家分:37620] 发布于 2007-08-10 22:04:00
在QB里,字符串是一个很灵活很方便很快捷的变量类型,
遇到不定长的东西,尝试使用字符串,你会有很多收获.
3 楼
张扬SKY [专家分:20] 发布于 2007-11-03 13:55:00
分解4到100之间的偶数能由两个素数组合!!
for i=4 to 100
for j=2 to i/2
f=1
for k=2 to int(sqr(j))
if j mod k =0 then f=0 :exit for
next k
if f=1 then
a=i-j
f=1
for b=2 to int(sqr(a))
if a mod b =0 then f=0:exit for
next b
if f= 1 then print i;"=";j"+";a :exit for
end if
next j
next i
这是在不用GOTO和子程序的基础上,有很多重复的!但应该是这样吧!
一开始特纠结这歌德巴赫的猜想的!后来发现编程有很多方法的!话说我对软件开发很有兴趣,但编程对我来说成了一大痛处啊!
J从2 TO I/2,不用测到最后了!中间的值的就行了!从2开始才是素数
4 楼
人才锐锐 [专家分:260] 发布于 2007-11-03 20:20:00
听高手专业术语还是蛮有道理的![em9]
我来回复