试图将阶乘部分转换为另一个功能

时间:2015-08-05 05:25:29

标签: c function sum factorial

我必须开始感谢你们的帮助。我试图将代码的阶乘部分转换为另一个函数,并且想知道我是否需要在

中添加所有内容
#include <stdio.h>
#include <stdlib.h>


int main()
{
    int num;
    int indx;
    int arrayIndx;
    int accumulator;
    int fact;
    int individualDigit[50];
    int length;

for(indx = 99999; indx > 0; indx--)
{

    num = indx;
    for (length = 0; num > 0; length++)
    {
        individualDigit[length] = num % 10;
        num /= 10;
        }

        accumulator = 0;
        for (arrayIndx = 0; arrayIndx < length; arrayIndx++)
        {
            fact = 1;
            while(individualDigit[arrayIndx] > 0)
            {
                fact*= individualDigit[arrayIndx];
                individualDigit[arrayIndx]--;
            }
            accumulator += fact;
        }

        if(accumulator == indx)
        {
            printf("%d ", accumulator);
        }


    }
    return 0;
}   

1 个答案:

答案 0 :(得分:2)

你的程序设计很糟糕。它没有缩进,您使用的是变量名indexindxidex,这会让读者感到困惑,并导致长期维护的噩梦。因此,因子计算也应该具有更好的模块性。

但除此之外,您的程序按照您的要求执行,正确计算阶乘并将其添加到accumulator变量中。唯一的问题是你永远不会打印那个累加器,除了最后2个案例(2和1)n = n!

简单地替换:

if (accumulator == indx)
{
printf("\n%d\n", indx);
}

printf("\n%d\n", accumulator);

你会看到你的结果。

如果要将阶乘的总和存储在数组中,只需在int sumOfFact[26] = {0};之前声明int individualDigit[50];来定义数组并将sumOfFact[0]初始化为1,然后再添加在打印累加器之前sumOfFact[indx] = accumulator;

要将阶乘部分放在函数中,这很简单。首先将它声明在你的主要上方:

int ffact(int n);

在你的代码中的任何地方定义它(最终在另一个编译单元 - 一个.c文件 - 如果你想要的话)

inf ffact(int n) {
    fact = 1;
    while (n > 1) {
        fact *= n--;
        /* if (fact < 0) { fprintf(stderr, "Overflow in ffact(%d)\n", n); return 0; } */
    }
    return fact
}

我注释掉了溢出测试,因为我假设你使用至少32位int并且fact(9)不会溢出(但事实(13)会...)

计算阶乘总和的循环变为:

accumulator = 0;
for (arrayIndx = 0; arrayIndx < length; arrayIndx++)
{
    accumulator += ffact(individualDigit[arrayIndx]);
}
printf("\n%d\n", accumulator);

模块化的优点:单独测试ffact的代码更简单。因此,当出现问题时,你不必在一条超过40行的简单代码中爬行(不包括缺席但必需的注释)。代码没有longers使individualDigit数组混乱。