NC1 大数加法(四种语言+视频讲解)
大数加法
https://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475?tpId=188&&tqId=38569&rp=1&ru=/activity/oj&qru=/ta/job-code-high-week/question-ranking
- 设计思想:
-视频讲解链接B站视频讲解
- 复杂度分析:
- 代码:
c++版本:
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ string solve(string s, string t) { // write code here int len_i = s.size()- 1; int len_j = t.size() -1; if(len_i < len_j) swap(s,t),swap(len_i,len_j);//如果字符串s的长度比字符串t的长度小就交换 int temp = 0;//用来就当前这一位的加和 int carry = 0;//保存进位 int c = len_i - len_j; while(c > 0){ t = '0' + t; c --; } for(int i = len_i;i >= 0;i --){ temp = s[i] - '0' + t[i] - '0' + carry; if(temp >= 10){ temp -= 10; carry = 1; }else{ carry = 0; } s[i] = temp + '0'; } //99 + 1 if(carry == 1){ s = '1' + s; } return s; } };
Java版本:
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ public String solve (String s, String t) { // write code here int len_i = s.length()- 1; int len_j = t.length() -1; if(len_i < len_j) { //如果字符串s的长度比字符串t的长度小就交换 String temp1 = s; s = t; t = temp1; int temp = len_i; len_i = len_j; len_j = temp; } int temp = 0;//用来就当前这一位的加和 int carry = 0;//保存进位 int c = len_i - len_j; StringBuffer a = new StringBuffer(s); StringBuffer b = new StringBuffer(t); while(c > 0){ b.insert(0,"0"); c --; } for(int i = len_i;i >= 0;i --){ temp = a.charAt(i) - '0' + b.charAt(i) - '0' + carry; if(temp >= 10){ temp -= 10; carry = 1; }else{ carry = 0; } char ss = (char)(temp + '0'); a.setCharAt(i,ss); } if(carry == 1){ a.insert(0,"1"); } return a.toString(); } }
Python版本:
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # 计算两个数之和 # @param s string字符串 表示第一个整数 # @param t string字符串 表示第二个整数 # @return string字符串 # class Solution: def solve(self , s , t ): maxlen = max(len(s),len(t)) s = s.zfill(maxlen) t = t.zfill(maxlen) res = '' carry = 0 for i in range(-1, -maxlen-1,-1): temp = ord(s[i]) + ord(t[i]) -96 + carry if temp >= 10:#如果temp的值超过9则有进位 temp -= 10 carry = 1 else: carry = 0 res += str(temp)#当前这位做完加法后的值 if carry: #99 + 1 = 100 发生了进位,所以最后得特判一下是否有类似这样的进位 res += str(1) return res[::-1]
JavaScript版本:
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ function solve( s , t ) { // write code here let len_i = s.length - 1; let len_j = t.length -1; if(len_i < len_j){ //如果字符串s的长度比字符串t的长度小就交换 let temp1 = s; s = t; t = temp1; let temp = len_i; len_i = len_j; len_j = temp; } let temp = 0;///用来就当前这一位的加和 let carry = 0;///保存进位 let c = len_i - len_j;///用来给短的那一字符串添加前导“0” while(c > 0){ t = '0' + t; c --; } let sum = ""; for(let i = len_i;i >= 0;i --){///倒着开始进行进位运算 temp = parseInt(s[i]) + parseInt(t[i]) + carry; if(temp >= 10){///如果temp的值超过9则有进位 temp -= 10; carry = 1; }else{ carry = 0; } sum = String.fromCharCode(temp + 48) + sum; //s[i] = String.fromCharCode(temp + 48);///当前这位做完加法后的值 } if(carry == 1){ ///d sum = "1" + sum ; } return sum; } module.exports = { solve : solve };
牛客题霸 文章被收录于专栏
本专栏主要是牛客题霸习题的讲解,有详细的考点分类,大家可以可以看看呦!!!