大数相乘-算法

作者: 柠檬草YF | 来源:发表于2019-08-14 11:40 被阅读1次

参考文章

题目

编写两个任意位数的大数相乘的程序,给出计算结果。比如:

题目描述:   输出两个不超过100位的大整数的乘积。
输入: 输入两个大整数,如1234567 和 123
输出: 输出乘积,如:151851741

思路

将每一位相乘,相加的结果保存到同一个位置,到最后才计算进位。
例如:计算98×21,步骤如下
1          9  8
2  ×       2  1
3  -------------
4         (9)(8)  <---- 第1趟: 98×1的每一位结果 
5    (18)(16)     <---- 第2趟: 98×2的每一位结果 
6  -------------
  (18)(25)(8)  <---- 这里就是相对位的和,还没有累加进位 

Objective-C 版


/**
 * 大数相乘方法二
 */
- (NSString *)bigNumberMultiply2:(NSString *)num1 num2:(NSString *)num2 {
    
    NSMutableArray *sumArray = [NSMutableArray array];
    //
    for (int i = 0; i < num1.length; i++){
        NSString *numSubstr1 = [num1 substringWithRange:NSMakeRange(i, 1)];
        
        for (int j = 0; j < num2.length; j++){
            NSString *numSubstr2 = [num2 substringWithRange:NSMakeRange(j, 1)];
            NSInteger index = i + j;

            if (sumArray.count > index) {
                NSString *indexStr = sumArray[index];
                NSString *replaStr = [NSString stringWithFormat:@"%@",@(indexStr.longLongValue + numSubstr1.longLongValue * numSubstr2.longLongValue)];
                [sumArray replaceObjectAtIndex:index withObject:replaStr];
            } else {
                NSString *replaStr = [NSString stringWithFormat:@"%@",@(numSubstr1.longLongValue * numSubstr2.longLongValue)];
                [sumArray addObject:replaStr];
            }
        }
    }
    
    //单独处理进位
    for(NSInteger k = sumArray.count - 1; k > 0; k--){
        NSString *indexStr = sumArray[k];

        if(indexStr.longLongValue > 10){
            NSString *indexStrd1 = sumArray[k-1];
            NSString *indexStr11 = [NSString stringWithFormat:@"%@",@(indexStrd1.longLongValue + indexStr.longLongValue / 10)];
            [sumArray replaceObjectAtIndex:k-1 withObject:indexStr11];
            [sumArray replaceObjectAtIndex:k withObject:[NSString stringWithFormat:@"%@",@(indexStr.longLongValue % 10)]];
        }
    }
    
    // 处理数组第一个数
    if (sumArray.count) {
        NSString *indexStr = sumArray[0];
        if(indexStr.longLongValue > 10){
            NSString *indexStr11 = [NSString stringWithFormat:@"%@",@(indexStr.longLongValue / 10)];
            [sumArray insertObject:indexStr11 atIndex:0];
            if (sumArray.count > 1) {
                [sumArray replaceObjectAtIndex:1 withObject:[NSString stringWithFormat:@"%@",@(indexStr.longLongValue % 10)]];
            } else {
                [sumArray addObject:[NSString stringWithFormat:@"%@",@(indexStr.longLongValue % 10)]];
            }
        }
    }
   
    NSMutableString *sumString = [NSMutableString string];
    for (NSString *str in sumArray) {
        [sumString appendString:str];
    }
    NSLog(@"%@ * %@ = %@",num1,num2,sumString);
    
    return sumString;
}

swift 版 待更新

相关文章

  • 大数相乘算法

    1、计算两个大数相乘的结果。2、算法流程:(1)大数可能超出任何一种整数类型,会引发溢出问题,所以用字符串的格式存...

  • 大数相乘-算法

    参考文章 题目 思路 例如:计算98×21,步骤如下 Objective-C 版 swift 版 待更新

  • 大数相乘之Karatsuba算法

    问题大数相乘 计算123×456,其实12345和6789就是大数。 思路 这是分治算法思想的典型体现。计算机只会...

  • OC大数相加相乘算法

    前些天做了份笔试题,最后一道题是写一个大数相乘的算法,太久没做题了,也没有草稿纸,脑子没动起来,笔就开始天马行空了...

  • 大数相乘--golang简单实现

    大数乘法之golang实现所谓大数相乘(Multiplication algorithm),就是指数字比较大,相乘...

  • 算法之俩个大数相乘

    具体实现如下: 运行结果:

  • 大数相乘

    所谓大数相乘(Multiplication algorithm),就是指数字比较大,相乘的结果超出了基本类型的表示...

  • 大数相乘

  • 大数相乘

    两个大数相乘,这两个大数分别是a和b,现在分割成两部分,每一部分都是N位,假设是10进制的,其实对于2进制也同样适...

  • 大数相乘

网友评论

    本文标题:大数相乘-算法

    本文链接:https://www.haomeiwen.com/subject/rnfgjctx.html