[英]Finding the factorial of odd number from the input value in 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) :
#include <stdio.h>
int main()
{
int input;
long double result = 1;
printf("Enter the integer number : ");
scanf("%d", &input);
printf("n:!\n\n");
for(int i = 1; i <= input; i++)
{
result *= i;
if(i%2==1){ printf("%d:%Le\n", i, result); } //note that im using %Le for long double type
}
還要小心你用於結果的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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.