为什么加减乘除计算不进位,加减乘除有效数字怎么确定

首页 > 实用技巧 > 作者:YD1662023-04-16 19:44:26

一个加法流程

当然在具体实现上方法较多,你可以首先就将字符串逆置然后从前往后就可以计算了。当然我这里实现的是字符串从后向前各个位对应计算,然后将结果顺序添加到 StringBuilder 上。

这题在力扣【415两数相加】可以检验自己代码,实现代码为:

public String addStrings(String num1, String num2) {
// 公众号:bigsai 欢迎你的关注
int len1=num1.length-1,len2=num2.length-1;
char ch1=num1.toCharArray;
char ch2=num2.toCharArray;

StringBuilder sb=new StringBuilder;
int remainder =0;//计算余数
while (len1>=0||len2>=0)
{
int n1=len1>=0?(ch1[len1--]-'0'):0;
int n2=len2>=0?(ch2[len2--]-'0'):0;
int num=n1 n2 remainder;//求和对应数字
remainder=num/10;//是否进位
sb.append(num);// 添加到结果字符串中
}

if(remainder>0)//是否还需要进位
{
sb.append(remainder);
}
//反装即为结果
return sb.reverse.toString;
}

为什么加减乘除计算不进位,加减乘除有效数字怎么确定(5)

大数减法

加法对应的就是减法,有了上面大数加法的实现思路,那么我想你在大数减法也应该有点想法,但是减法和加法不同的是减法有位置的区别,加法需要进位而减法需要借位。并且大整正数减法可能产生正负也不一定。

两个正数,如果大数减去小数,那么一切正常,结果是一个正数;但如果小数减去大数,那么结果将是一个负数,并且结果处理起来比较麻烦。所以在这里全部转成大-小处理(大-小不存在不能借位的情况)。

为什么加减乘除计算不进位,加减乘除有效数字怎么确定(6)

减法转成大-小

  1. 执行计算前首先比较减数(num1)和被减数(num2)的大小,如果num1>num2,那么就模拟num1-num2的过程,如果num1<num2,那么结果就为-(num2-num1) 。当然可以为了稳定模拟时候一个大一个小,可将 num1 始终指向较大的那个数,少写一个 if/else.

  2. 在比较两个数字大小的时候,因为是字符形式,首先比较两个字符串的长度,长的那个更大短的那个更小,如果两个字符串等大,那么就可以通过字典序从前往后进行比较(Java 可直接使用 compareTo 方法)。

  3. 和加法不同的是,减法前面可能产生若干前缀 0,这些0是需要你去掉的,例如"1100"-"1000"计算得到的结果为"0100",你就要把前面的0去掉返回"100"。

  4. 具体实现的时候和加法相似,如果使用 StringBuilder 存储,需要逆置顺序,如果是个负数,前面还要加上'-'.

  5. 每个位置正常进行减法运算,如果值小于0,那么就需要向上借位( 10),那么处理上一位进行减法时候还要将借位的处理一下。

为什么加减乘除计算不进位,加减乘除有效数字怎么确定(7)

这题在力扣上没有原题,但是可以在小米 OJ【大数相减】上验证自己代码的正确性,具体实现的代码为:

public static boolean compare(String num1,String num2)
{
if(num1.length<num2.length)
return false;
else if(num1.length>num2.length)
return true;
else
return num1.compareTo(num2)>0;
}
public static String subtractString(String num1,String num2) {
char sign=' ';//正负号
//让num1>num2 如果num1<num2 那么结果就是—(num2-num1)
//可以先将num1和num2交换和前面情况统一
if(!compare(num1,num2))
{
sign='-';
String team = num2;
num2 = num1;
num1 = team;
}
int len1=num1.length-1;
int len2=num2.length-1;

char ch1 = num1.toCharArray;
char ch2 = num2.toCharArray;
StringBuilder sb=new StringBuilder;
int borrow=0;//借位
while (len1>=0||len2>=0)
{
int n1=len1>=0?(ch1[len1--]-'0'):0;
int n2=len2>=0?(ch2[len2--]-'0'):0;

int num=n1-n2-borrow;
borrow=0;
if(num<0)//需要向前借位
{
borrow=1;
num =10;
}
sb.append(num);
}

sb=sb.reverse;//需要先翻转
int index = 0;//去掉前面没用的’0‘
while (index<sb.length&&sb.charAt(index) == '0')
{
index ;
}
//如果两个数相同 直接返回"0"
if(index==sb.length)
return "0";
if(sign==' ')//如果正数
return sb.substring(index);
else return sign sb.substring(index);//负数需要返回
}

为什么加减乘除计算不进位,加减乘除有效数字怎么确定(8)

上一页12345下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.