我写了这个函数,它应该找到最小的正整数,它可以被1到20的每个数字整除。我得到“堆栈溢出错误”,即使我测试数字1到10,它也可以正常工作。 这是我的代码:
#include<iostream>
#include<cstdlib>
using namespace std;
// function prototype
int smallPos(int k, int m,int n);
int main(){
printf("the smallest positive number that is divisible by 1 through 20 is %d ", smallPos(1,1,13));
}
int smallPos(int k, int n, int m){
int div=0;
for(int i = n;i<=m;i++) {
if (k%i==0)
div++;
}
if (div==m) {
return k;
} else {
k+=1;
smallPos(k,n,m);
}
}
为什么会这样?无论如何,这个数字不应该那么大。 谢谢!
答案 0 :(得分:5)
最终条件(div == m
)永远不会成立。要使div
等于m
,数字k
应该可以被{em>所有范围[n,m)
中的数字整除。
修改:我重新阅读printf()
调用中的文字,了解该功能的作用。您正在寻找第一个可被该范围内的所有数字整除的数字。如果我的计算是正确的,那么这个数字应该是该范围内数字的所有唯一素因子的乘积。对于范围[1,13]
(根据函数调用,而不是文本),此数字应为:
30030 = 1 * 2 * 3 * 5 * 7 * 9 * 11 * 13
现在,这意味着你将以递归的方式调用函数超过30,000次,这对于你正在使用的堆栈大小来说显然是太多倍了(默认值相对较小)。对于这个大小的范围,你应该考虑编写一个迭代函数。
编辑:这是一个似乎有效的迭代版本。
int smallPos ( int n, int m )
{
int k = 0;
while ( ++k )
{
int count = 0;
for (int i = n; i<=m; i++)
{
if (k%i==0) {
++count;
}
}
if (count == (m-n+1)) {
return k;
}
}
return k;
}
确实,smallPos(1,10)
的结果,结果是2520.看来我先前的估计是下限,而不是固定的结果。
答案 1 :(得分:1)
您的smallPos
函数会导致未定义的行为,因为它没有在所有执行路径中返回值。您可能希望在最后一部分中说return smallPos(k,n,m);
(或者一次只是return smallPos(k + 1, n, m);
)。