最近看到一些大公司的面试题:计算100的阶乘
开始考虑怎么实现
最初的想法是使用do while循环实现,相应的代码如下:
int i = 1;
NSInteger result = 1;
do {
result = result * i;
NSLog(@"当前的result为%ld",(long)result);
NSLog(@"当前的i的值为%d",i);
i++;
} while ( i <= 100);
结果运行之后,result的结果为0
通过调试发现运行过程没错,出现这种问题是因为result数值太大超过了NSInteger的范围
也就是所谓的溢出
后面尝试更改其他的数据类型,oc中长数据最大的就是long long吧,结果更换成longlong后,还是溢出
通过查找网上其他的方法,发现确实有办法显示出来,比如使用double类型等
但是这道题只是考思路,并没有一定要出数值
在网上看到两种方法,一种是类似我上面的循环(我没有考虑到0的阶乘的情况),另一种是递归实现
在这里记录一下
循环实现100的阶乘计算
long long dofactorial(int min, int max) {
if (min > max) {
return 0;
}
if (min == 0) {
if (max == 0) {
//0的阶乘是1
return 1;
} else {
min = 1;
}
}
long long result = 1;
for (int i = min; i < max; i++) {
result *= i;
NSLog(@"result = %lld",result);
if (result > INT_MAX) {
return -1;
}
}
return result;
}
使用递归实现
- (long long)recursion1:(NSInteger)n {
if (n == 0) {
return 1;
}
return n * [self recursion1:(n-1)];//递归公式
}
网友评论