_Sakura__ 2023-10-15 18:27 采纳率: 62.5%
浏览 10

斐波那契数列求奇偶性问题

题目是一个斐波那契数列求第n项的奇偶性,因为n非常非常大可能有1万位(1万个位数,超范围了),所以可以找规律发现每个被三整除的项都是偶数其余是奇数,我用的是各位数字之和能被三整除的数是三的倍数的数学性质进行判断,但不知道为什么代码仍然有误。

img


#include <stdio.h>
int main()
{
    char a;
    unsigned long long sum=0;
    while (scanf("%c",&a)!=EOF)
    {
        int m=a-'0';
        sum+=m;
    }
    if (sum%3==0)
    {
        printf("EVEN");
    }
    else
    {
        printf("ODD");
    }
    return 0;
}
  • 写回答

2条回答 默认 最新

  • CodeXTreme工作室 2023-10-15 18:41
    关注

    1.在循环中逐个读取字符,然后计算它们的数字和。然而,您没有限制这个循环以避免读取超出预期的字符。这可能导致程序在读取到文件结束前的字符时崩溃或产生错误。
    2.当您计算字符的数字和时,您需要考虑到进位。例如,如果您有一个数字5,那么在ASCII码中,'5'的值为53。因此,如果您从53中减去'0'的ASCII值(48),那么结果就是5。但是,如果您的数字是如'6'(ASCII值为54)或更大的数,那么仅仅通过减去'0'的ASCII值并不能得到正确的结果。在这种情况下,您需要进行进位处理。

    以下是修复这些问题后的代码:

    #include <stdio.h>
    
    int main()
    {
        char a;
        unsigned long long sum = 0;
        int carry = 0;
        while (scanf("%c", &a) != EOF)
        {
            int m = a - '0';
            sum += m + carry;
            carry = (m + carry) % 10;
        }
        if (sum % 3 == 0)
        {
            printf("EVEN\n");
        }
        else
        {
            printf("ODD\n");
        }
        return 0;
    }
    

    这段代码考虑到了进位,在循环中适当地结束了输入。它应该能正确地处理大斐波那契数列项的奇偶性判断了。

    评论

报告相同问题?

问题事件

  • 修改了问题 10月15日
  • 修改了问题 10月15日
  • 创建了问题 10月15日