转自:http://www.th7.cn/Program/IOS/201211/113566.shtml
突然有人问你100!结果有几个零。其实这也是个口算题目了。。0乘任何数都为0,5乘偶数也有0,25,75就两个0了。所以,你可以数一数几个末位为0,几个数末位为5。然后就可较快速的得到结果了。
但是当别人让你计算出具体结果时你怎么算呢?肯定不是一个递归就可以轻松搞定了。
当进行乘法运算时总要考虑到数据类型是否溢出,算法是否足够快等等问题的。这其实就是大数乘法的问题了。记住,回答,大数乘法要用string就可以了。
具体怎么实现呢?简单的说就是将数字,转成string,然后一位一位的计算,再考虑进位等,最后拼接成string显示。
下面简单写了下响应的算法。
首先,我们都知道乘法计算要用到加法,那么就要先能实现一个大数相加的算法。下面用objc来实现:
+(Nsstring *)addWithBigNums:(Nsstring *)num1 num2:(Nsstring *)num2{ Nsstring *result = [Nsstring string]; //确保num1大些,如果不是,则调换。 if (num1.length < num2.length){ result = [Nsstring stringWithString:num1]; num1 = [Nsstring stringWithString:num2]; num2 = [Nsstring stringWithString:result]; result = [Nsstring string]; } //进位 int carryBit = 0; //加法的最大位 int largestBit = 0; for (int i = 1 ; i <= num2.length ; i++){ //num1 的当前位 int intNum1 = [[num1 substringWithRange:NSMakeRange(num1.length - i,1)] intValue]; //num2 的当前位 int intNum2 = [[num2 substringWithRange:NSMakeRange(num2.length - i,1)] intValue]; int intTemp = intNum1 + intNum2 + carryBit; if (intTemp > 9){ carryBit = 1; result = [Nsstring stringWithFormat:@"%d%@",intTemp % 10,result]; }else{ carryBit = 0; result = [Nsstring stringWithFormat:@"%d%@",intTemp,result]; } if (i == num2.length){ if (num1.length == num2.length){ if (carryBit) result = [Nsstring stringWithFormat:@"%d%@",carryBit,result]; }else{ largestBit = [[num1 substringWithRange:NSMakeRange(num1.length - i - 1,1)] intValue]; Nsstring *restStringOfNum1 = [num1 substringWithRange:NSMakeRange(0,num1.length - num2.length - 1)]; result = [Nsstring stringWithFormat:@"%@%d%@",restStringOfNum1,largestBit + carryBit,result]; } } } return result;}
然后是大数相乘的算法,这里面又将大数拆分成数组进行计算:
1 +(Nsstring *)mutiplyWithBigNums:(Nsstring *)num1 num2:(Nsstring *)num2 2 3 { 4 5 Nsstring *result = [Nsstring string]; 6 7 //按两位来分组每一个乘数 8 9 NSArray *arrayNum1 = [self tearStringToArray:num1];10 11 NSArray *arrayNum2 = [self tearStringToArray:num2];12 13 14 15 循环分组内的元素,相乘16 17 Nsstring *tempResult = [Nsstring 18 19 for (int i = 0 ; i < [arrayNum1 count] ; i ++){20 21 int item1 = [[arrayNum1 objectAtIndex:i] intValue];22 23 24 25 int j =0 ; j < [arrayNum2 count]; j ++26 27 int item2 = [[arrayNum2 objectAtIndex:j] intValue];28 29 30 31 int temp = item1 * item2;32 33 tempResult = [Nsstring stringWithFormat:@"%d",temp];34 35 int k = 0 ; k < i + j ; k ++36 37 tempResult = [tempResult stringByAppendingString:038 39 }40 41 42 43 if (result.length){44 45 result = [self addWithBigNums:result num2:tempResult];46 47 }else48 49 result = tempResult;50 51 52 53 }54 55 }56 57 58 59 return result;60 61 }62 63 64 65 +(NSArray *)tearStringToArray:(Nsstring *)66 67 68 69 NSMutableArray *array = [NSMutableArrayarrayWithCapacity:.length];70 71 72 73 for (unsigned long i = string.length; i > 0; i --74 75 Nsstring *temp = [string substringWithRange:NSMakeRange(i - 1,1)];76 77 [array addobject:temp];78 79 80 81 82 83 [array mutablecopy];84 85 86 87
把这个两个函数封装成一个工具类:CaculatorHelper
在你的app delegate里面调用一下:
1 Nsstring *temp = [Nsstringstring]; 3 for(1; i <= [self.input.stringValue intValue]; i ++ 5 Nsstring *num1 = nil; 7 if (i == 1) num1 = [Nsstring stringWithFormat: 9 else if (i == [self.input.stringValue intValue]) break;11 else num1 = temp;13 Nsstring *num2 = [Nsstring stringWithFormat:",i+15 temp = [CaculatorHelper mutiplyWithBigNums:num1 num2:num2];17 21 self.result.stringValue = [self.result.stringValuestringByAppendingFormat:%@! = %@23
这样就可以了。计算结果就显示在下面的
NSTextField里面了。
在mac上试验一下,就可以看到结果了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。