前言:
当前同学们对“c语言数学竖式输出”大概比较讲究,各位老铁们都需要知道一些“c语言数学竖式输出”的相关资讯。那么小编在网络上网罗了一些对于“c语言数学竖式输出””的相关内容,希望大家能喜欢,小伙伴们快快来了解一下吧!向英雄致敬,向逝者致哀 愿逝者安息,生者奋发 愿国泰民安,山河无恙
前言
在写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); }}
需要Java架构全套VIP资料教程的 私信我【资料】,免费领取!!