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