加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

ObjC 实现的大数相加,大数相乘和n的阶乘

发布时间:2020-12-14 04:00:06 所属栏目:大数据 来源:网络整理
导读:转自:http://www.th7.cn/Program/IOS/201211/113566.shtml 突然有人问你100!结果有几个零。其实这也是个口算题目了。。0乘任何数都为0,5乘偶数也有0,25,75就两个0了。所以,你可以数一数几个末位为0,几个数末位为5。然后就可较快速的得到结果了。 但是

转自: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上试验一下,就可以看到结果了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读