Golang 【大字符串相加,求和】
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
题目示例示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
解题思路
分别解析两个字符串、并获取从末尾获取个位数,并进行相加、需要注意的是两个字符串可能存在长度不一致的情况,需要做兼容处理。
核心的思路:
- 两数相加之后用该数、取个位数用: %10 如果进一之后则要加上
- 两数相加之后用该数,看是否进一: /10
核心代码:
add该属性,则在最外层,用来标识是否需要进一
//两个字符串个位数相加
result := x + y + add
//取个数字之后、并拼接新的字符串
ans=strconv.Itoa(result%10)+ans
//看是否需要进一
add=result/10
第一种实现-Golang
func TestStrSum(t *testing.T){
fmt.Printf("sum: %v \n",sum("191","121"))
fmt.Printf("sum: %v \n",sum("10","100"))
}
//大字符串相加
func sum(str1,str2 string) string {
//获取两个字符串的长度
str2Count:=len(str2)
str1Count:=len(str1)
//如果个位相加、超过十,则进一
add := 0
//最后拼接的字符串
ans := ""
//倒序从两个字符串末尾开始相加、可能存在两个字符串长度不相等,故用或
for( str1Count>0 || str2Count>0){
x:=0
//防止下标越界
if(str1Count>0){
x=int(str1[str1Count-1]-'0')
}
y:=0
//防止下标越界
if(str2Count>0){
y=int(str2[str2Count-1]-'0')
}
//两个字符串个位数相加
result := x + y + add
//取个数字之后、并拼接新的字符串
ans=strconv.Itoa(result%10)+ans
//看是否需要进一
add=result/10
//len --
str1Count--
str2Count--
}
//输出字符串
return ans
}
第二种实现-Java
注意:java默认两个字符串长度一样
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
public class StringSum {
public static void main(String[] args) {
System.out.println("sum:"+new StringSum().sum(new ArrayList<String>(Arrays.asList("191","121"))));
System.out.println("sum2:"+sum2("191","121"));
}
public String sum (ArrayList<String> strings) {
BigInteger bgSum = new BigInteger("0");
for(String str : strings){
bgSum = bgSum.add(new BigInteger(str));
}
return bgSum.toString();
}
public static String sum2(String a,String b){
a= new StringBuilder(a).reverse().toString();
b= new StringBuilder(b).reverse().toString();
int alen=a.length();
int add=0;
StringBuffer sb=new StringBuffer();
for (int i = 0; i < alen; i++) {
char x = a.charAt(i);
char y = b.charAt(i);
int result = x - '0' + y - '0' + add;
//个位数
int r1 = result % 10;
//进一
add = result / 10;
sb.append(r1);
}
return sb.reverse().toString();
}
}
结果验证
Java结果验证:
Golang结果验证: