突然有人問你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 string]; 18 19 for (int i = 0 ; i < [arrayNum1 count] ; i ++){ 20 21 int item1 = [[arrayNum1 objectAtIndex:i] intValue]; 22 23 24 25 for (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 for (int k = 0 ; k < i + j ; k ++){ 36 37 tempResult = [tempResult stringByAppendingString:@"0"]; 38 39 } 40 41 42 43 if (result.length){ 44 45 result = [self addWithBigNums:result num2:tempResult]; 46 47 }else{ 48 49 result = tempResult; 50 51 } 52 53 } 54 55 } 56 57 58 59 return result; 60 61 } 62 63 64 65 +(NSArray *)tearStringToArray:(NSString *)string 66 67 { 68 69 NSMutableArray *array = [NSMutableArrayarrayWithCapacity:string.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 return [array mutableCopy]; 84 85 } 86 87
把這個兩個函數封裝成一個工具類:CaculatorHelper
隨便拉一個框調用下:
在你的app delegate里面調用一下:
1 NSString *temp = [NSStringstring]; 2 3 for(int i = 1; i <= [self.input.stringValue intValue]; i ++){ 4 5 NSString *num1 = nil; 6 7 if (i == 1) num1 = [NSString stringWithFormat:@"%d",i]; 8 9 else if (i == [self.input.stringValue intValue]) break; 10 11 else num1 = temp; 12 13 NSString *num2 = [NSString stringWithFormat:@"%d",i+1]; 14 15 temp = [CaculatorHelper mutiplyWithBigNums:num1 num2:num2]; 16 17 } 18 19 20 21 self.result.stringValue = [self.result.stringValuestringByAppendingFormat:@"%@! = %@",self.input.stringValue,temp]; 22 23
這樣就可以了。計算結果就顯示在下面的
NSTextField里面了。
在mac上試驗一下,就可以看到結果了。