我正在尝试制作一个程序,给出一个特定的总和,直到我定义的某个点,这里是:
float sum(int n,float m);
main(void) {
float a,m=1.0;
int n;
scanf_s("%ld", &n);
a = sum(n, m);
printf("%f", a);
}
float sum(int n, float m) {
if ((n/m) < 0.0005) {
return 0;
}
else {
return n/m + sum(n, m + 2);
}
}
(请注意,我定义的点是0.0005)当我给出一个大于或等于5的值时,程序会给我这个错误:
......已停止工作
此外,当我将定义的点增加到0.5时,我可以给出的值的数量也会增加。为什么你认为这种情况发生了,我该如何解决呢?
答案 0 :(得分:1)
%ld
scanf_s
格式说明符需要long int *
参数。你传入的是int *
。这些类型不兼容。使用错误的格式说明符会调用undefined behavior,在这种情况下会显示为崩溃。
int *
的正确格式说明符为%d
:
scanf_s("%d", &n);
编辑:
您看到的崩溃可能是堆栈溢出。 sum
函数将递归调用自身1000 * n
次。我在MSVC下看到了类似的错误,但是有不同的限制。你可以通过迭代解决方案解决这个问题:
float sum(int n, float m){
float result = 0;
while ((n/m) >= 0.0005){
result += n/m;
m+=2;
}
return result;
}