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. 将两个字符串转换为字符数组,以最长字符串的长度+1作为结果字符数组的长度
  2. 设置两个指针从数组的尾部进行遍历移动,将对应位置的数进行相加,取其个位数,并将进位保存下来
  3. 两个字符的相加减实际上是对应ASCII码的相加减,结果是一个整型
  4. 若两个字符串长度不同,没遍历完的继续加入到结果数组中,因为最高位没有进位,所以需要返回从索引1开始的字符串
  5. 若两个字符串长度相同,需要判断最高位是否有进位,即判断保存的进位是否为零,有进位就加入到结果数组中

实现代码

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();
 }

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务