2015-08-05 2 views
1

Я должен поблагодарить вас, ребята, за помощь. Я пытаюсь превратить факторный часть кода в другой функции, и было интересно, если мне нужно, чтобы добавить все, что в программеПопытка превратить факториальную часть в другую функцию

#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

Вы должны действительно рассмотреть отступы своего кода. – Rohcana

+1

Почему вы печатаете накопленное значение только в том случае, если 'accumulator == indx'? В чем причина этого состояния? Почему бы просто не напечатать «аккумулятор» безоговорочно? –

+0

Я делаю это, чтобы увидеть, действительно ли это добавляет значения из факториала. –

ответ

2

You плохо разработан. Он не с отступом, вы используете имена переменных index, indx и idex, что сбивает с толку читателя и приведет к кошмарам для долгосрочного обслуживания. Также факториальное вычисление заслуживает того, чтобы функционировать для лучшей модульности.

Но кроме того, ваша программа делает то, что вы просите, правильно вычисляет факториалы и добавляет их в переменную accumulator. Единственная проблема заключается в том, что вы никогда не печатаете этот аккумулятор, за исключением последних двух случаев (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 и факт (9) не будет переполнения (но факт (13) будет ...)

цикл вычисления суммы факториалов становится:

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

Преимущества для этой модульности: проще проверить код для ffact. Поэтому, когда что-то идет не так, вам не нужно сканировать один простой кусок кода из более чем 40 строк (не считая отсутствующих, но необходимых комментариев). И код больше не мешает массиву individualDigit.

+0

Спасибо за помощь. Я много очистил и пытаюсь превратить факторное уравнение в функцию, но не могу. –

+0

Вот пример. Но вы действительно должны прочитать некоторые уроки на языке C ... –

+0

Спасибо. Что именно вы подразумеваете под переполнением? –

Смежные вопросы