我正在尝试使用如下的
方法-(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的阶乘,所以它继续直到它达到零。
我无法确切地知道问题究竟在哪里。
答案 0 :(得分:2)
因为您使用的是unisgned值,所以乘法会导致溢出。这就是为什么21!看起来小于20!在你的申请中。
log2(21!)= 65.4,所以无符号数学只是抛出高阶位。
答案 1 :(得分:2)
因子大于usigned long
允许的因子,导致溢出(从0再次开始)使其看起来更小。