簡體   English   中英

從C中的輸入值中找到奇數的階乘

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM