我必须开始感谢你们的帮助。我试图将代码的阶乘部分转换为另一个函数,并且想知道我是否需要在
中添加所有内容#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;
}
答案 0 :(得分:2)
你的程序设计很糟糕。它没有缩进,您使用的是变量名index
,indx
和idex
,这会让读者感到困惑,并导致长期维护的噩梦。因此,因子计算也应该具有更好的模块性。
但除此之外,您的程序按照您的要求执行,正确计算阶乘并将其添加到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
数组混乱。