题解 | #大数相减#

大数相减

https://www.nowcoder.com/practice/ae4d84312e384a1fa100b613f93f3fe0

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param num1 string字符串
     * @param num2 string字符串
     * @return string字符串
     */
    public String substring (String a, String b) {
        // write code here
        if (compare(a, b) == -1) {
            return "-" + substring(b, a) ;
        }
        int c = 0 ;
        int i = a.length() - 1, j = b.length() - 1 ;
        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0) {
            //以下为一种写法
            /*
            int m = (i >= 0 ? a.charAt(i) - '0' : 0) - c ;
            int n = j >= 0 ? b.charAt(j) - '0' : 0 ;
            if (m < n) {
                sb.append(m + 10 - n);
                c = 1 ;                     
            } else {
                sb.append(m - n);
                c = 0 ;
            }
            */
            //以下为另一种写法
            int m = i >= 0 ? a.charAt(i--) - '0' : 0 ;//m为被减数,上面那个
            int n = j >= 0 ? b.charAt(j--) - '0' : 0 ;//n为减数,下面那个
            if(m - c - n < 0) {
                //如果是1-2,需要借位,即借来10,变成11-2=9
                  sb.append((m - c - n + 10)) ;
                c=1;
             }
            else {
                sb.append(m-n-c);
                c=0;
            }
            //或者统一写成sb.append((m - c - n + 10) % 10);
            //这样写的话如果m-c-n<0,如1-2,借位11-2=9,9%10=9,结果正确
            //如果m-c-n>0,如3-2,13-2=11,11%10=1,结果正确
            
            
        }
        
        String ret = sb.reverse().toString();
        //删除前导0
        /*
        例如,当121-120=001,需要将前面的0删除,得到最终结果1。注意121-121=000这种情况,不要把所有0都删了!
        */
        i = 0 ;
        while (i < ret.length() - 1 && ret.charAt(i) == '0') i++;
        return ret.substring(i, ret.length());


    }
    //比较a和b的大小
    int compare (String a, String b){
        int m = a.length();
        int n = b.length();
        if (m != n) {
            return m > n ? 1 : -1;
        }
        int i = 0;
        while (i < n) {
           int p = a.charAt(i) ;
           int q = b.charAt(i) ;
           if (p > q) {
               return 1 ;
           } else if (p < q) {
               return -1 ;
           } else {
               i++;
           }
        }
        return 0 ;

    }
}
全部评论

相关推荐

05-29 22:11
门头沟学院 Java
Elastic90:抛开学历造假不谈,这公司的招聘需求也挺怪的,Java开发还要求你有图文识别、移动端开发和c++的经验,有点逆天了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务