以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
数据范围:,字符串仅由'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); } }