以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
数据范围:
,字符串仅由'0'~‘9’构成
要求:时间复杂度
function solve(a,b){
var res='', c=0;
a = a.split('');
b = b.split('');
while (a.length || b.length || c){
c += ~~a.pop() + ~~b.pop();
res = c % 10 + res;
c = c>9;
}
return res.replace(/^0+/,'0');
} 说一下思路
//好方法
import java.util.*;
import java.math.BigInteger;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
if(s==null||"".equals(s)){
return t;
}
if(t==null||"".equals(t)){
return s;
}
int i=s.length()-1;
int j=t.length()-1;
int m1=0,m2=0,carray=0;//进位
StringBuilder sb = new StringBuilder();
while(i>=0||j>=0){
if(i>=0){
m1=s.charAt(i)-'0';
}else{
m1=0;
}
if(j>=0){
m2=t.charAt(j)-'0';
}else{
m2=0;
}
int sum=m1+m2+carray;
carray=sum/10;
sb.append((char)((sum%10)+'0'));
i--;
j--;
}
if(carray!=0) sb.append('1');
sb.reverse();
return sb.toString();
}
} public static String solution(String s,String t){
int slen = s.length()-1;
int tlen = t.length()-1;
int carry = 0;
StringBuffer sb = new StringBuffer();
while(slen>=0||tlen>=0||carry>0){
int snum = slen>=0?s.charAt(slen)-'0':0;
int tnum = tlen>=0?t.charAt(tlen)-'0':0;
int num = (snum+tnum+carry)%10;
carry = (snum+tnum+carry)/10;
sb.append(num);
slen--;
tlen--;
}
return sb.reverse().toString();
}
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
string solve(string s, string t) {
string ans = "";
int carry = 0;
for(int i=s.size()-1, j=t.size()-1; i>=0 || j>=0; i--, j--){
int x = i < 0 ? 0 : s[i] - '0';
int y = j < 0 ? 0 : t[j] - '0';
int sum = x + y + carry;
carry = sum / 10;
ans = to_string(sum % 10) + ans;
}
if(carry > 0)
ans = '1' + ans;
return ans;
}
};
public String solve (String s, String t) {
if (s.length() < t.length()) {
String temp = s;
s = t;
t = temp;
}
StringBuilder sb = new StringBuilder();
int longLength = s.length();
int shortLength = t.length();
int carry = 0;
for (int i = 0; i < shortLength; i++) {
int add = (s.charAt(longLength-1-i) - '0') + (t.charAt(shortLength-1-i) - '0') + carry;
sb.append(add % 10);
carry = add / 10;
}
for (int i = shortLength; i < longLength; i++) {
int add = (s.charAt(longLength-1-i) - '0') + carry;
sb.append(add % 10);
carry = add / 10;
}
if (carry != 0) {
sb.append(carry);
}
return sb.reverse().toString();
}
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
string solve(string s, string t) {
int max_length = s.length() > t.length() ? s.length() + 1 : t.length() + 1;
string temp_zero1(max_length - s.length(), '0');
s = temp_zero1 + s; //对s补0操作
string temp_zero2(max_length - t.length(), '0');
t = temp_zero2 + t; //对t补0操作
string ans;
char temp_num[2];
temp_num[1] = '\0';
for (int i = s.length() - 1; i >= 0; i--) //从最末一位开始往前加
{
if ((s[i] - '0') + (t[i] - '0') >= 10) //有进位
{
s[i - 1] = s[i - 1] + 1; // 进一位
temp_num[0] = '0' + ((s[i] - '0') + (t[i] - '0') - 10);
ans.insert(0, temp_num);
}
else //无进位
{
temp_num[0] = '0' + (s[i] - '0') + (t[i] - '0');
ans.insert(0, temp_num);
}
}
if (ans[0] == '0')
ans = ans.erase(0, 1);
return ans;
}
}; public String solve (String s, String t) {
// write code here
if(s == null || s.length() == 0){
return t;
}
if(t == null || t.length() == 0){
return s;
}
StringBuilder result = new StringBuilder();
int i = s.length()-1;//表示s的下标
int j = t.length()-1;//表示t的下标
int carry = 0;//表示进位
//从后往前分别遍历两个字符串,把对应位置的数字进行相加
while(i >= 0 || j >= 0 || carry != 0){
//如果越界的话就取0,否则就取对应下标的数字
int num1 = i >= 0?s.charAt(i)-'0':0;
int num2 = j >= 0?t.charAt(j)-'0':0;
//不要忘记加进位
int sum = num1 + num2 + carry;
//更新进位
carry = sum / 10;
//更新结果
result.append(sum%10);
//更新下标
i--;
j--;
}
//最后要对result进行逆序
return result.reverse().toString();
} class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
string solve(string s, string t) {
// write code here
int i = s.size()-1, j = t.size()-1;
string res;
int c = 0;
while(i >= 0 && j >= 0){
int base = s[i] + t[j] - '0' + c - '0';
res = res.insert(0, 1, base%10+'0');
c = base/10;
--i, --j;
}
while(i >= 0){
int base = s[i] + c - '0';
res = res.insert(0, 1, base%10+'0');
c = base/10;
--i;
}
while(j >= 0){
int base = t[j] + c - '0';
res = res.insert(0, 1, base%10+'0');
c = base/10;
--j;
}
if(c != 0) res = res.insert(0, 1, c+'0');
return res;
}
};
public String solve (String s, String t) {
// write code here
StringBuilder sb =new StringBuilder();
int i =s.length()-1,j=t.length()-1,c=0;
while(i>=0||j>=0||c!=0){
int ii =i>=0? s.charAt(i--)-'0':0;
int jj =j>=0?t.charAt(j--)-'0':0;
c = ii+jj+c;
sb.append(c%10);
c /=10;
}
return sb.reverse().toString();
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
StringBuilder ans=new StringBuilder();
int tmp=0;
int i=s.length()-1,j=t.length()-1;
//从后往前遍历两个字符串
while(i>=0&&j>=0){
//把要相加的字符转换成数字
int x=s.charAt(i)-48;
int y=t.charAt(j)-48;
//记录相加后的本位结果,并转回字符
char z=(char)((x+y+tmp)%10);
//记录相加后的进位结果
tmp=(x+y+tmp)/10;
//把本位的结果插入结果字符串中
ans.insert(0,(char)(z+48));
i--;
j--;
}
//继续加完剩下的字符,记得要把进位加上
while(i>=0){
int x=s.charAt(i)-48;
char z=(char)((x+tmp)%10);
tmp=(x+tmp)/10;
ans.insert(0,(char)(z+48));
i--;
}
//继续加完剩下的字符,记得要把进位加上
while(j>=0){
int y=t.charAt(j)-48;
char z=(char)((y+tmp)%10);
tmp=(y+tmp)/10;
ans.insert(0,(char)(z+48));
j--;
}
//最后的进位不要忘记加上
if(tmp!=0){
ans.insert(0,(char)((char)tmp+48));
}
return ans.toString();
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
StringBuilder sb = new StringBuilder();
char[] sChar = s.toCharArray();
char[] tChar = t.toCharArray();
int sLen = sChar.length - 1;
int tLen = tChar.length - 1;
int c = 0;
while (sLen >= 0 || tLen >= 0 || c != 0) {
int a = sLen >= 0 ? sChar[sLen--] - '0' : 0;
int b = tLen >= 0 ? tChar[tLen--] - '0' : 0;
int n = a + b + c;
c = n / 10;
sb.append(n % 10);
}
return sb.reverse().toString();
}
} function solve( s , t ) {
// write code here
// 首先取出大数中长度最长的
let maxLength = Math.max(s.length,t.length);
// 用0 补齐长度
s = s.padStart(maxLength,0);
t = t.padStart(maxLength,0);
// 定义加法过程中需要用到的变量
let a = 0;
let b = 0; //进位
let sum = "";
for( let i = maxLength - 1; i >=0; i--){
a = parseInt(s[i]) + parseInt(t[i]) + b;
b = Math.floor(a/10);
sum = a%10 + sum;
}
if( b == 1){
sum = "1" + sum;
}
return sum; // ==================== function prototype ====================
size_t str_len(const char * s);
void reverse(char * s, int len);
// ==================== function prototype ====================
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
char* solve(char* s, char* t) {
char* ans = (char*) calloc(100010, sizeof(char));
int ansSize = 0;
int i = str_len(s) - 1, j = str_len(t) - 1, sum = 0;
while (i >= 0 || j >= 0 || sum) {
sum += (i >= 0 ? s[i--] - 48 : 0) + (j >= 0 ? t[j--] - 48 : 0);
*(ans + ansSize++) = sum % 10 + 48;
sum /= 10;
}
reverse(ans, ansSize);
return ans;
}
size_t str_len(const char * s) {
if (!*s) return 0;
const char * p = s;
while (*++p);
return p - s;
}
void reverse(char * s, int len) {
int l = -1, r = len;
while (++l < --r) {
*(s + l) ^= *(s + r);
*(s + r) ^= *(s + l);
*(s + l) ^= *(s + r);
}
}