美文网首页
两个大数相加

两个大数相加

作者: jayhe | 来源:发表于2020-05-17 16:01 被阅读0次

    两个大数相加。
    1、是整数;
    2、两个数无限大,long都装不下;
    3、不能用BigInteger;
    4、不能用任何包装类提供的运算方法;
    5、两个数都是以字符串的方式提供。

    这里可能超过long long的表示范围,那么就不能用常规的整数相加了会溢出;这里我们尝试采用字符串的方式来表示相加的结果,这样就能表示位数超过长整型表示的范围了

    实现思路

    • 倒序遍历计算每一位的相加结果a;a%10则为该位的结果,a/10则为进位
    • 循环的最大次数位2个字符串的长度的最大值
    • 遍历完成后,查看最后一次循环的进位是否大于0,则将进位值插入到字符串的头部
    • 数字类型字符串可以用ascii码去接收每一位的值;'0' ASCII码对应的是48,'1' 对应的是49以此类推,那么对于每一位的ascii值减去'0'就是对应的数值了

    代码实现

    - (NSString *)addString:(NSString *)stringA withString:(NSString *)stringB {
        if ((stringA && [stringA characterAtIndex:0] == '-') || (stringB && [stringB characterAtIndex:0] == '-')) {
            NSAssert(NO, @"参数需要为非负数");
            return nil;
        }
        NSMutableString *string = [NSMutableString string];
        NSInteger indexA = stringA.length;
        NSInteger indexB = stringB.length;
        NSInteger maxLength = MAX(indexA, indexB);
        int carryBit = 0;
        int genericBinary = 10; // 进制为十进制
        for (NSInteger i = 0; i < maxLength; i++) {
            // 从后往前开始遍历
            indexA--;
            indexB--;
            // unichar == unsigned short
            char a = indexA >= 0 ? [stringA characterAtIndex:indexA] : '0';
            char b = indexB >= 0 ? [stringB characterAtIndex:indexB] : '0';
            /*
            '0' ASCII码对应的是48
            '1' 对应的是49以此类推
            */
            int addValue = a + b - 2 * '0' + carryBit; // 对应位相加的结果+进位就是和
            int reminder = addValue % genericBinary; // 取余就是该位的值
            carryBit = addValue / genericBinary; // 取商就是进位的值
            [string insertString:[NSString stringWithFormat:@"%d", reminder] atIndex:0];
        }
        if (carryBit == 1) { // 遍历完后,如果还有进位,那么就将进位的值放在头
            [string insertString:[NSString stringWithFormat:@"%d", carryBit] atIndex:0];
        }
        
        return string;
    }
    

    相关文章

      网友评论

          本文标题:两个大数相加

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