iOS:带有大因子的无符号长

时间:2015-08-19 23:01:06

标签: ios unsigned factorial

我正在尝试使用如下的

方法
-(void)getFactorial{
    NSString *numStr = [NSString stringWithFormat:@"%@", _maxTF.text];
    max = strtoull([numStr UTF8String], NULL, 0);
    for (unsigned long i = 1; i< max ; i++) {
        unsigned long factorial = [self factorial:i];
       if(factorial <= max){
          NSLog(@"%lu (%lu!  =  %lu)",i ,i ,factorial);
       }else{
          break;
       }
    }
}

-(unsigned long) factorial:(unsigned long)n
{
    if (n==0) {
        return 1;//TODO make it empty
    }
    else
    {
        return n*[self factorial:n-1];
    }
}

它很简单,工作正常..直到我尝试数字(18446744073709551615) 当i = 20时,它应该停止,但21的阶乘实际上小于20的阶乘,所以它继续直到它达到零。

我无法确切地知道问题究竟在哪里。

2 个答案:

答案 0 :(得分:2)

因为您使用的是unisgned值,所以乘法会导致溢出。这就是为什么21!看起来小于20!在你的申请中。

log2(21!)= 65.4,所以无符号数学只是抛出高阶位。

答案 1 :(得分:2)

因子大于usigned long允许的因子,导致溢出(从0再次开始)使其看起来更小。