两个大数相加

两个大数相加。
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;
}

你可能感兴趣的:(两个大数相加)