前言:
眼前姐妹们对“算法pat”大致比较关心,我们都需要了解一些“算法pat”的相关资讯。那么小编也在网络上汇集了一些对于“算法pat””的相关知识,希望兄弟们能喜欢,大家快快来了解一下吧!其实在写Java代码的时候,其实很少人会去考虑高精度运算,即使遇到无法避免高精度的计算问题也不会太烦恼,因为有大整数类BigInteger以及BigDecimal工具使用。
但是抛开Java不说,举例:为一家银行计算员工工资,使用JS去处理计算然后做页面展示的,但是因为银行系统 引入包是比较费劲的,所以第一次将高精度运算运用到工作中,之后由于使用Java越来越多,对于手撸高精度计算代码也就越来越少了。
直到使用C++刷PAT算法的时候,又不可避免的使用到高精度算法(因为long int和long long也无法解决整数长度受限的问题), 所以用Java来实现高精度的运算,除法就先放一放,因为高精度除高精度有点难,今天小编就给大家分享下高精度的加减乘。先看一下效果图(上方结果使用BigInteger的方法,下方结果自定义实现)
高精度的加法是比较容易理解的和实现,我们只需要注意进位就好, 将输入整数的字符串,进行遍历,将char类型转为int进行相加,保存进位在下一轮循环中使用即可。
private static void add(String a, String b) {
System.out.println("加===");
BigInteger ba = new BigInteger(a);
BigInteger bb = new BigInteger(b);
System.out.println("结果=" + ba.add(bb));
String res = "";
int temp;
int adv = 0;
for (int i = a.length() - 1, j = b.length() - 1; i > -1 || j > -1; ) {
if (i > -1 && j > -1)
temp = (a.charAt(i--) - '0') + (b.charAt(j--) - '0');
else if (i > -1)
temp = (a.charAt(i--) - '0');
else
temp = (b.charAt(j--) - '0');
temp += adv;
adv = temp / 10;
res = temp % 10 + res;
}
if (adv != 0) {
res = adv + res;
}
System.out.println("结果=" + res);
}
高精度减法和加法比较,稍微复杂一些,因为在减法中,需要根据输入数字的相对大小来判断是否输出负号,还需要注意是否要"借位",以及对于结果进行高位去0
private static void sub(String a, String b) {
System.out.println("减===");
BigInteger ba = new BigInteger(a);
BigInteger bb = new BigInteger(b);
System.out.println("结果=" + ba.subtract(bb));
String res = "";
int temp;
int sub = 0;
String ch = "";
if (a.length() < b.length() || (a.compareTo(b) < 0)) {//正数
String c = a;
a = b;
b = c;
ch = "-";
}
for (int i = a.length() - 1, j = b.length() - 1; i > -1 || j > -1; ) {
if (i > -1 && j > -1) {
int tempA = a.charAt(i--) - '0' + sub;
sub = 0;
int tempB = b.charAt(j--) - '0';
if (tempA < tempB) {
sub = -1;
temp = tempA + 10 - tempB;
} else {
temp = tempA - tempB;
}
} else if (i > -1) {
temp = (a.charAt(i--) - '0') + sub;
sub = 0;
} else {
temp = (b.charAt(j--) - '0') + sub;
sub = 0;
}
res = temp + res;
}
//高位去0
int spilt = 0;
for (int i = 0; i < res.length(); i++) {
if (res.charAt(i) - '0' != 0) {
break;
} else {
spilt++;
}
}
res = res.substring(spilt);
System.out.println("结果=" + ch + res);
}
乘法和加法类似,但是因为涉及到累计相加的过程(模拟算术做竖式乘法的过程),所以结合数组更加方便理解一些
private static void multiply(String a, String b) {
System.out.println("乘法===");
BigInteger ba = new BigInteger(a);
BigInteger bb = new BigInteger(b);
System.out.println("结果=" + ba.multiply(bb));
int as[] = new int[a.length()];
int bs[] = new int[b.length()];
for (int i = 0; i < a.length(); i++) {
as[i] = a.charAt(a.length() - i - 1) - '0';
}
for (int i = 0; i < b.length(); i++) {
bs[i] = b.charAt(b.length() - i - 1) - '0';
}
int res[] = new int[b.length() + a.length()];
for (int i = 0; i < a.length(); i++) {
int adv = 0;
int j;
for (j = 0; j < b.length(); j++) {
res[i + j] = as[i] * bs[j] + adv + res[i + j];
adv = res[i + j] / 10;
res[i + j] = res[i + j] % 10;
}
res[i + j] = adv;
}
int len = a.length() + b.length() - 1;
if (res[len] == 0) len--;
System.out.printf("结果=");
for (int i = len; i >= 0; i--) {
System.out.printf(res[i] + "");
}
}
主函数:
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入a");
String a = "";
if (scanner.hasNext())
a = scanner.next();
System.out.println("输入b");
String b = "";
if (scanner.hasNext())
b = scanner.next();
add(a, b);
sub(a, b);
multiply(a, b);
}
}
好了,以上就是今天的分享内容了,今天的知识你学到了吗?没学到没关系我们每天都会为大家分享。