2013-06-04 2 views
2

Использование только для операторов while или while, я пытаюсь создать программу для создания и печати таблицы из первых 10 факториалов. Вот мой код:Код для факториалов в объекте C

for (count = 1; count<=10; ++count) 
    { 
     n = count; 
     while (n > 0){ 
      count *= (count-1); 
      n -= 1; 
     } 
     NSLog(@" %2g   %3g", count, factorial); 
    } 

Я не понимаю, почему это не работает. Он никогда не выходит из цикла и продолжается вечно. Какая коррекция? Спасибо!

+1

Сторона примечания: используйте таблицы (символ * '\ t' *) вместо того, чтобы записывать все эти пробелы вручную. –

ответ

1

В течение первого цикла итерации счетчик равен 1 и так же п равно 1, то введите время и вы установили счетчик нулю (кол-1), и уменьшить н который становится нулевым, и вы выходите из него. Таким образом, во время второго цикла итерация счет будет равна нулю. Вы продолжаете уменьшать счет, и он никогда не увеличивается, поэтому вы никогда не выходите из цикла, пока не произойдет числовое переполнение.

Вы делаете это сложнее, чем оно (и также неэффективно). Достаточно, что вы множатся п для графа получить факториал:

int n=1; 
for (count = 1; count<=10; ++count) 
{ 
    n*= count; 
    NSLog(@"%d",n); 
} 
4

Причина:

count *= (count-1); 

С count начинается с 1, он всегда будет сброшен в 0, так условие внешнего цикла всегда будет истинным, следовательно, бесконечным циклом.

И все же вы все равно его поносите.

for (int i = 1; i <= 10; i++) { 
    int r = 1, n = i; 
    while (n) 
     r *= n--; 

    printf("%d! = %d\n", i, r); 
} 
4

В Math, n! это то же самое, Г (п + 1) (см: http://en.wikipedia.org/wiki/Gamma_function)

Так просто использовать:

-(float)factorial:(float)number1 { 
    return tgammaf(++number1); 
} 

Это будет работать даже на поплавки и отрицательных чисел,

другие опубликованные решения длинные и посторонние и работают только с положительными целыми числами.

+0

Вам нужно использовать '++ number1' вместо того, чтобы' number1' увеличивался ** до того, как ** передается 'tgammaf'? – justinpawela

+0

@ user2194039 Я признаю, что я еще не «эксперт» в объективе-c, но я не думаю, что это так, как работает объектив-c. Я никогда не слышал о ++ num, НО, я почти уверен, что num ++ будет обработан до того, как tgammaf –

+0

'++ num' отличается от' num ++ ', и это характерно для многих языков программирования, включая C и семейство. '++ num' increments' num' _before_ возвращает его. 'num ++' увеличивает 'num' _after_, возвращая его. В вашей функции вы хотите, чтобы 'tgammaf (num + 1)', который должен сказать 'num', должен быть увеличен _before_' tgammaf' получает его. Использование 'num ++' increments 'num' только _after_' tgammaf' получает его. [Википедия] (https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B) показывает, что C и семейство поддерживают как '++ num', так и' num ++ '. – justinpawela