2013-06-04 39 views
2

仅使用for或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

In Math,n!是一回事Γ(N + 1)(参见:http://en.wikipedia.org/wiki/Gamma_function

所以只需使用:

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

这甚至会为花车和负数的工作,

发布的其他解决方案很长且无关紧要,只能与 正整数一起使用。

+0

您是否需要使用'++ number1',以便在**传递给'tgammaf'之前'number1'增加**? – justinpawela

+0

@ user2194039我会承认我目前还不是一个“专家”的objective-c,但我不认为这就是objective-c的工作原理。我从来没有听说过++ num,但是,我几乎可以肯定,num ++将在处理之前进行处理。tgammaf –

+0

'++ num'与'num ++'不同,这对许多编程语言(包括C和family)都很常见。 '++ num'增加'num' _before_返回它。 'num ++'递增'num' _after_返回它。在你的函数中,你需要'tgammaf(num + 1)',也就是说''num''必须增加_before_'tgammaf'得到它。使用'num ++'递增'num'只有_after_'tgammaf'得到它。 [Wikipedia](https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B)显示C和家族都支持'++ num'和'num ++'。 – justinpawela