ObjC 實現的大數相加,大數相乘和n的階乘


突然有人問你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上試驗一下,就可以看到結果了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM