在学习Matlab时,我遇到了这个问题:给定一个整数1<d<15
,找出最小的p,q
(正整数),使得abs(p/q-pi)<=10^-d
。
我的尝试是这样的:我首先想到我需要绑定p,q
来创建循环,所以我分别输入p,q
的M,N
上界作为输入数据,下面是我的算法:
M=input('Give an upper bound for p:')
N=input('Give an upper bound for q:')
d=input('Give a positive integer between 1 and 15:')
for q=1:N
for p=1:M
if abs(pi-p/q)<=10^(-d)
break
end
end
end
有什么问题吗?先谢谢你。
1条答案
按热度按时间jrcvhitl1#
问题在于您选择终止
for
循环的方式:break
仅停止内部循环。请尝试以下代码,并检查p
和q
的值,执行将在该值处停止:其给出以下输出:
当然,有更好的方法来捕获所有满足条件的整数对(例如,使用
disp
代替error
),这超出了本答案的范围,但我将在这里提供几个例子:上面的脚本将安静地结束:(p,q)对将被存储在
pair
矩阵中。下面的代码将直接打印这些对:
为了实验的需要,并根据@Cris Luengo的评论,这里有一个稍微更详细的脚本版本:x1M7 N1 x循环被封装在专用函数中,并且x1M8 N1 x循环很好地跟踪进程,并且用x1M10 N1 x对填充x1M9 N1 x矩阵:
如果您对
pi
的连续分数近似值感兴趣,请尝试rat(pi, Tol)
,其中Tol
是公差。