如何解决为什么我的代码在 9 之后没有生成阶乘?
用 C 编写一个程序来计算从命令行传递的数字的阶乘。这 factorial 必须在一个名为 computeFact( ) 的单独函数中计算,该函数具有以下内容 原型: int computeFact(int,…);
#include <stdarg.h>
#include <stdio.h>
#include<stdlib.h>
int computeFact(int,...);
int main(int argc,char *argv[])
{
if (argc < 2)
{
printf("Invalid!");
} else {
for (int i = 1; i < argc; i++)
{
int n = atoi(argv[i]);
printf("Factorial of %d is %d\n",n,computeFact(n));
}
}
printf("\n");./
return 0;
}
int computeFact(int num,...)
{
va_list valist;
int fact = 1;
va_start(valist,num);
for (int i = 0; i < num; i++)
{
int x=va_arg(valist,int);
if(x==0)
return 1;
else
{
for(int j = 1; j <= x; j++)
fact=fact*j;
return fact;
}
}
va_end(valist);
}
输出如下:
~$ ./1 1 2 3 4 5 6 7 8 9 10
Factorial of 1 is 1
Factorial of 2 is 2
Factorial of 3 is 6
Factorial of 4 is 24
Factorial of 5 is 120
Factorial of 6 is 720
Factorial of 7 is 5040
Factorial of 8 is 40320
Factorial of 9 is 362880
Factorial of 10 is 1
~$ ./1 0
Factorial of 0 is 1
~$ ./1 99
Factorial of 99 is 362880
~$ ./1 98
Factorial of 98 is 40320
~$ ./1 5
Factorial of 5 is 120
我认为将 string 转换为 int 存在一些错误,因为计算阶乘只占用两位数中的最后一位,但我无法确定我的代码中究竟要更正什么。
解决方法
您通过读取一个通过 va_arg
不存在的参数来调用未定义的行为。
在这种情况下,您似乎应该停止使用 va_*
宏,而只需使用参数 num
。
int computeFact(int num,...)
{
int fact = 1;
int x=num;
if(x==0)
return 1;
else
{
for(int j = 1; j <= x; j++)
fact=fact*j;
return fact;
}
}
还要注意 int
的限制。 99!
将是 156 位十进制数字,它不符合典型的 int
(最多 2,147,483,647 = 2**31 - 1
)的范围。
试试下面的代码:
int computeFact(int num,...)
{
int fact = 1;
int x = num;
if(x==0)
return 1;
else
{
for(int value = 1; value <= x; value++)
fact=fact*value;
return fact;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。