主题:请教一个很简单的问题
goldenfire
[专家分:0] 发布于 2005-06-15 20:56:00
我是Qbasic 入门学习者,今有一数学问题需要使用Qbasic解决,尝试了一下编了几行代码没有成功,请各位帮帮忙
我的题目:
a=2*d+e-b-c
a=e*(d^2-e^2/4)^0.5/b
a=(c^2-b^2)^0.5
未知数a,b,c,d,e
求解不定方程的正整数解
我设计的代码
for a = 100 to 1000
for b = 100 to 1000
for c = 100 to 1000
for d = 100 to 1000
a=2*d+e-b-c
a=e*(d^2-e^2/4)^0.5/b
a=(c^2-b^2)^0.5
print a,b,c,d,e
if a>1 and b>1 and c>1 and d>1 and e>1 then print a,b,c,d,e :end
next d,c,b,a
end
运算结果出现illegal function
请各位指点一下哪里的问题,并附带上正确的代码
万分感谢
回复列表 (共22个回复)
沙发
digital1010 [专家分:1430] 发布于 2005-06-15 21:11:00
少了三个NEXT
for a = 100 to 1000
for b = 100 to 1000
for c = 100 to 1000
for d = 100 to 1000
a=2*d+e-b-c
a=e*(d^2-e^2/4)^0.5/b
a=(c^2-b^2)^0.5
print a,b,c,d,e
if a>1 and b>1 and c>1 and d>1 and e>1 then print a,b,c,d,e
next d,c,b,a
end
板凳
digital1010 [专家分:1430] 发布于 2005-06-15 21:12:00
这样会有错吗?
运行错误吗?
3 楼
nhjane [专家分:30] 发布于 2005-06-15 21:55:00
那e没有赋值过呀,e不就都等于0了吗?
4 楼
goldenfire [专家分:0] 发布于 2005-06-15 23:50:00
是这样,我如果选定e的范围,运算就无法运行,直接显示illegal function,我观察了一下它的运算过程,先是把b选定在100,然后从100到1000试A,完了我觉得应该试b
=101了,但是这时候就出现illegal function,我个人认为是因为在第三个方程中C^2必须>b^2,但是一旦试到B=101,c=100就出问题了,于是就停了,有没有一个参数能让程序忽略这种错误继续试呢?
楼上有没有解决这个题的完整方法呢?
谢谢
5 楼
goldenfire [专家分:0] 发布于 2005-06-15 23:52:00
有谁能不能给出一个类似题目完整的思路或者代码格式?
6 楼
moz [专家分:37620] 发布于 2005-06-16 09:12:00
是这样的,
1. 你一直都是在对 a 赋值,
所以那一个for a = 100 to 1000 是无效的.
2. e 从来没有赋过值,也是无效的.
3. 你用了三句对 a 赋值的语句,
而且计算对象的值也没有改变过,
所以只有最后一句赋值语句才是有效的,
前面两句 a= 有等于无.完全没用.
4. 最后一句 a=(c^2-d^2)^.5
0.5次方就是开平方,
负数是不能开平方的,
当 c < d 的时候,括号里面的数就变成负数了,
于是便出现对负数开平方的错误了.
7 楼
goldenfire [专家分:0] 发布于 2005-06-16 09:35:00
对于第四个问题我也是这么认为的,但是有什么好的解决办法吗?因为这5个值都是在100-1000范围内的。有没有类似的语句能不能让程序忽略类似的错误?
最好看看各位能不能用完整的代码给我表示出来
8 楼
goldenfire [专家分:0] 发布于 2005-06-16 09:38:00
这三个方程试我们自己倒出来的,其实不算是给它赋值,是联立起来。
原始方程是这样
a^2+b^2=c^2
a+b+c=2*d+e
a*b=e*(d^2+e^2/4)^0.5
9 楼
moz [专家分:37620] 发布于 2005-06-16 11:03:00
方程和编程语句的含义是不一样的,
你别乱搞.
你的取值范围没错吧?
既然你也懂得用数学的方法去解,
就应该用数学方法去解效率会更好,
还能锻炼你的思维能力,
在这方面计算机的好处就显示在穷举方面了.
当然可以用QB来算,但不应该是你那样做.
10 楼
moz [专家分:37620] 发布于 2005-06-16 11:20:00
取值范围没错的话,方程式是不会有错的.
本身就全是正数,用不着去管正不正解了.
只是5个for实在效率太低了,
直观一点的程序应该如下,高效一点的框架得请教fw先生,他很拿手.
for a=100 to 1000
for b=100 to 1000
for c=100 to 1000
for d=100 to 1000
for e=100 to 1000
if (a^2+b^2=c^2) and (a+b+c=2*d+e) and (a*b=e*(d^2+e^2/4)^0.5) then print a,b,c,d,e
next e,d,c,b,a
我来回复