提交时一直显示存在除以0的情况,但我找了好久也没有找出来啊……
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int a(int n);
int b(int n, int m);
int main() {
int n;
while (scanf("%d",&n)) {
if (n == 0) {
break;
}
int n_2 = n / 2;//最多可以有n_2个2
int sum = 1;//方法数
int i;
for (i = 1; i <= n_2; i++) {
int n_1 = n - i * 2;//有i个2时对应的1的个数
sum += b((n_1 + i), i);
}
printf("%d\n", sum);
}
return 0;
}
//求阶层
int a(int n) {
int f;
if (n == 0 || n == 1) {
return 1;
}
else {
f = a(n - 1) * n;
return f;
}
}
//求组合数
int b(int n, int m) {
if (n == m)
return 1;
else
return a(n) / (a(m) * a(n - m));
}
附题图
return a(n) / (a(m) * a(n - m));
这里调试下
【以下回答由 GPT 生成】
答案:
根据给出的代码,我们可以看到可能存在除以零的情况出现在函数b(int n, int m)
中,具体地是在计算组合数时,当m
等于n
时,会出现除以零的情况。
为了避免这种情况的发生,我们可以在函数b
中增加一个判断条件,当m
等于n
时,直接返回1而不进行除法运算。
下面是修改后的代码:
#include <stdio.h>
int a(int n);
int b(int n, int m);
int main() {
int n;
while (scanf("%d",&n)) {
if (n == 0) {
break;
}
int n_2 = n / 2; //最多可以有n_2个2
int sum = 1; //方法数
int i;
for (i = 1; i <= n_2; i++) {
int n_1 = n - i * 2; //有i个2时对应的1的个数
sum += b((n_1 + i), i);
}
printf("%d\n", sum);
}
return 0;
}
//求阶层
int a(int n) {
int f;
if (n == 0 || n == 1) {
return 1;
}
else {
f = a(n - 1) * n;
return f;
}
}
//求组合数
int b(int n, int m) {
if (n == m)
return 1;
else if(m > n || m < 0 || n < 0)
return 0;
else
return a(n) / (a(m) * a(n - m));
}
这样,我们对可能存在除以零的情况进行了处理,避免了程序运行时报错。
【相关推荐】