NC1+NC10:大数加乘法
大数加法
https://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475?tpId=188&&tqId=38569&rp=1&ru=/activity/oj&qru=/ta/job-code-high-week/question-ranking
NC1:大数加法
思路
- 将两个字符串转换为字符数组,以最长字符串的长度+1作为结果字符数组的长度
- 设置两个指针从数组的尾部进行遍历移动,将对应位置的数进行相加,取其个位数,并将进位保存下来
- 两个字符的相加减实际上是对应ASCII码的相加减,结果是一个整型
- 若两个字符串长度不同,没遍历完的继续加入到结果数组中,因为最高位没有进位,所以需要返回从索引1开始的字符串;
- 若两个字符串长度相同,需要判断最高位是否有进位,即判断保存的进位是否为零,有进位就加入到结果数组中
实现代码
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ public String solve (String s, String t) { // write code here if(s == null || t == null || s.length()==0 || t.length() == 0){ return ""; } char[] chs = s.toCharArray(); char[] cht = t.toCharArray(); int slen = s.length()-1; int tlen = t.length()-1; int len = (slen > tlen ? slen : tlen)+1; char[] res = new char[len+1]; int c = 0; //进位 while(slen>=0 && tlen>=0){ int a = chs[slen--] - '0';//两个字符相减实际上是ASCII码对应的数相减,结果是int类型 int b = cht[tlen--] - '0'; res[len--] = (char)((a+b+c)%10 + '0');//取个位 c = (a+b+c)/10; } while(slen >= 0){//chs未遍历完 int a = chs[slen--] - '0'; res[len--] = (char)((a+c)%10 + '0'); c = (a+c)/10; } while(tlen >= 0){//cht未遍历完 int b = cht[tlen--] - '0'; res[len--] = (char)((b+c)%10 + '0'); c = (b+c)/10; } if(c != 0){//chs与cht长度相等的情况,两数的最高位相加若有进位,也需要将其放进去 res[len] = (char)(c + '0'); return new String(res); } //最高位没有进位就返回从索引1开始的字符串 return String.valueOf(res).substring(1); } }
NC10:大数乘法
题目地址:NC10:大数乘法
思路
都是将字符串转换为字符数组再进行处理,具体步骤如下
实现代码
public String solve (String s, String t) { int len1 = s.length(); int len2 = t.length(); int[] nums1 = new int[len1]; int[] nums2 = new int[len2]; // 1.将字符串逐位放入整型数组 for(int i = 0; i < len1; i++){ nums1[i] = s.charAt(i) - '0'; } for(int i = 0; i < len2; i++){ nums2[i] = t.charAt(i) - '0'; } int[] result = new int[len1 + len2]; // 2. 逐位相乘放入结果数组 for(int i = 0; i < len1; i++){ for(int j = 0; j < len2; j++){ result[i + j] += nums1[i] * nums2[j]; } } // 3. 将结果数组中的元素从后往前进位 for(int k = result.length - 1; k > 0; k--){ result[k - 1] += result[k] / 10; //取十位上的数与前一位相加 result[k] = result[k] % 10; //将个位上的数存储在当前位置 } // 4.拼接字符串 StringBuilder stringBuilder = new StringBuilder(); for(int i = 0; i < result.length - 1; i++){ stringBuilder.append(result[i]); } return stringBuilder.toString(); }