如何解决从C中的输入值中找到奇数阶乘
#include <stdio.h>
int main()
{
int input;
int result = 1;
printf("Enter the integer number : ");
scanf("%d",&input);
printf("n:!\n\n");
for(int i = 1; i <= input; i = i + 2)
{
for(int k = 1; k <= i; k++)
{
result *= k;
}
printf("%d:%d\n",i,result);
}
return 0;
}
我创建了这样的代码来确定输入的奇数阶乘。在测试期间,我发现除5的阶乘外,值是错误的。似乎计算出错了,但是我不知道代码中的问题是什么。
解决方法
您的问题是,您要将结果与每个内部循环中的旧值相乘。在通过以下方法将内部循环重置结果开始为1之前解决此问题:
结果= 1;
,这与问题无关,但是我更喜欢避免使用该算法,因为它是O(n ^ 2/2),我们可以认为它是O(n ^ 2),而您可以使用它,它是O( n):
long
还要谨慎使用用于结果的 int 类型,int受限制,您应该使用 long double 因为事实运算的结果会很大
,首先,最好不要对未定义的数据(例如用户输入)使用scanf。实际上,“不使用scanf”规则通常是有效的。这样的程序最好改用命令行参数。
从技术上讲,C main应该是int main(void)
或int main(int argc,char *argv[]
的某些变体。
正如其他人提到的那样,在无负数的情况下,使用无符号整数进行这样的计算更为合理。对于像阶乘这样的东西,也应该使用更大的整数类型。
无论如何,关于主题:为什么不做得更简单?阶乘函数可以在一个循环中进行迭代。如果只想在i
为奇数时打印结果,只需检查它是否为奇数。
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
static unsigned get_input(void);
static unsigned interpret_string(const char *str);
int
main(int argc,char *argv[])
{
unsigned input;
uint64_t result = 1;
if (argc == 1) {
printf("Enter the integer number : ");
input = get_input();
putchar('\n');
} else {
input = interpret_string(argv[1]);
}
for (unsigned i = 1; i <= input; ++i) {
result *= i;
if (i & 1)
printf("%-2d = %"PRIu64"\n",(int)i,result);
}
return 0;
}
static unsigned
interpret_string(const char *str)
{
char *endp = NULL;
unsigned ret = strtoll(str,&endp,10);
if (endp == str) {
fprintf(stderr,"Invalid input \"%s\"\n",str);
exit(1);
}
return ret;
}
static unsigned
get_input(void)
{
char buf[1024];
fgets(buf,1024,stdin);
return interpret_string(buf);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。