java实现大数字的加减乘除
程序员文章站
2022-06-09 08:01:30
...
java代码实现 大数字的 加减乘除
一:加法
基本上是模拟了人工的算法,比如1234+987
a.先把位数补齐一致,变成:1234 + 0987
b.从各位开始运算,每次用一个变量记录是否要进位
c.遍历所有的位置就完成了加法;
代码如下:`
public class 大数加法 {
public static void main(String[] args) {
//输入2个字符串类型的大数字
String s1 = new Scanner(System.in).nextLine();
String s2 = new Scanner(System.in).nextLine();
String result=add(s1,s2);
System.out.println(result);
}
private static String add(String s1, String s2) {
//保证s1小于等于s2的长度
if(s1.length()>s2.length()){
String t=s1;
s1=s2;
s2=t;
}
int cha=s2.length()-s1.length();
for (int i = 0; i < cha; i++) {
s1='0'+s1; //把s2前面的空缺补上0
}
String result="";
int w=0; //定义一个进位的变量
for (int i = s2.length()-1; i >=0 ; i--) {
//从s1和s2中取出字符,减去48就是 int类型的数字,再加上进位就是当前位的结果
int c=s2.charAt(i)+s1.charAt(i)-96+w;
w=c/10; //把当前计算结果整除10就是 w的进位
result=(c%10) + result; //取余就是 当前位应该显示的数字,把它加在前面就可以了
}
//因为我们的循环没有判断第一位的进位 ,所以最后再判断一次
if(w==1)result=1+result;
return result;
}
}
二。减法
减法和加法类似,也是模拟人工计算
代码如下
public class 大数的减法 {
public static void main(String[] args) {
String s1 = new Scanner(System.in).nextLine();
String s2 = new Scanner(System.in).nextLine();
String result = jian(s1, s2);
System.out.println(result);
}
private static String jian(String s1, String s2) {
String fuhao = "";
int l1 = s1.length();
int l2 = s2.length();
//判断,如果s1小于s2那么 符号就是 - 然后,s1和s2交换位置,保证s1是大的
if ((l1 == l2 && s1.compareTo(s2) < 0) || l1 < l2) {
fuhao = "-";
String t = s1;
s1 = s2;
s2 = t;
}
for (int i = 0; i < Math.abs(l1-l2); i++) {
s2='0'+s2; //补0处理,使长度一致
}
String result="";
int w=0;
for (int i = s1.length()-1; i >=0 ; i--) {
//计算每一个位置的差,在加上借位w的值
int c=s1.charAt(i)-s2.charAt(i)+w;
//如果c小于0,说明需要借位,c+=10,然后w该为-1,否则,借位w=0
if(c<0){
c+=10;
w=-1;
}else{
w=0;
}
result=c+result; // 把当前位的数字放入result里
}
return fuhao+result;
}
}
3.乘法
乘法也是模拟人工计算,就是把其中一个数字,拆分成一位数,然后累和
例如 123* 45 就是123✖40+123✖5 其中加法用的是上面的add方法
代码如下:
import java.util.Scanner;
public class 大数的乘法 {
public static void main(String[] args) {
//输入2个数字
String s1 = new Scanner(System.in).nextLine();
String s2 = new Scanner(System.in).nextLine();
String result=muilt(s1,s2);
System.out.println(result);
}
private static String muilt(String s1, String s2) {
String result="";
//把s2拆分成一个一个的
for (int i = 0; i < s2.length(); i++) {
//计算s2中单个数字和s1的乘积
String temp=per(s1,s2.charAt(i));
//把每次计算的乘积想加(因为每次的乘积位置不一样,所以先要补0)
result=add(result,add_0(temp,s2.length()-1-i));
}
return result;
}
//单个数字和s1的积
private static String per(String s1, char c) {
int n=c-'0';
String result="";
int w=0;
for (int i = s1.length()-1; i >=0; i--) {
//计算当前位置的积
int m=(s1.charAt(i)-'0')*n+w;
// m/10就是进位值
w=m/10;
// m%10就是当前位置的值
result=m%10+result;
}
//对第一位进行判断
if(w!=0)result=w+result;
return result;
}
//大数和的方法
private static String add(String s1, String s2) {
//保证s1小于等于s2的长度
if(s1.length()>s2.length()){
String t=s1;
s1=s2;
s2=t;
}
int cha=s2.length()-s1.length();
for (int i = 0; i < cha; i++) {
s1='0'+s1;
}
String result="";
int w=0;
for (int i = s2.length()-1; i >=0 ; i--) {
int c=s2.charAt(i)+s1.charAt(i)-96+w;
w=c/10;
result=(c%10) + result;
}
if(w==1)result=1+result;
return result;
}
private static String add_0(String temp, int i) {
for (int j = 0; j < i; j++) {
temp=temp+'0';
}
return temp;
}
}
**
4.除法
**大数的除法和模拟人工不一样,
基本思路:例如 m/n
a.首先令temp=10kn ,并且temp<m, k取最大
b.然后m=m-temp ,当m<temp时停止,记录执行的次数i,和此时的k
c.当前次的result=i00…(k个0)
d.循环执行直到m<n,把result累加即可
如: 128/3
a. temp=30,k=1
b.128-30=98 i=1;98-30=68 i=2; 68-30=38 i=3; 38-30=8 i=4;8-30<0结束;
c;result=40(i=4,k=1)
d:temp=3,k=0
e:8-3=5 i=1; 5-3=2 i=2 ; 2-3<0 结束
f:result=40+2(i=2,k=0)
所以结果是42
import java.util.Scanner;
public class 大数的除法 {
public static void main(String[] args) {
String s1 = new Scanner(System.in).nextLine();
String s2 = new Scanner(System.in).nextLine();
//如果s1<s2那么就不运算了,直接返回0
if(!check(s1,s2)){
System.out.println(0);
return;
}
String result = chufa(s1, s2);
System.out.println(result);
}
private static boolean check(String s1, String s2) {
if(s1.length()<s2.length() || (s1.length()==s2.length() && s1.compareTo(s2)<0)){
return false;
}
return true;
}
private static String chufa(String s1, String s2) {
String result="";
//循环直到s1<s2为止
while(check(s1,s2)){
int n=s1.length()-s2.length();
//判断需要补多少0 ,如果s1的前m位(m=s2.length())比s2小,那么只要补n-1个0,否则需要补n个0(n=s1和s2的长度差)
//比如 123/3 , 3需要补成30,是n-1个,而 450/3 ,3需要补成300,是n个0
String num_0=s1.substring(0,s2.length()).compareTo(s2)>=0?get0(n):get0(n-1);
int i=0; //i代表减法执行了几次,也就是当前次的商
//减法循环
while(true){
String m=jian(s1,s2+num_0);
//如果减成负数了,那么就退出循环
if(m.startsWith("-"))break;
//否则 s1重新赋值
s1=m;
i++;
}
//把商补上位数的0,就是当前次的结果,再用 大数加的 方法和前面的数累加
result=add(""+i+num_0,result);
}
return result;
}
//返回 n个0的字符串
private static String get0(int n) {
String result="";
for (int i = 0; i < n; i++) {
result+='0';
}
return result;
}
//大数加
private static String add(String s1, String s2) {
//保证s1小于等于s2的长度
if(s1.length()<s2.length()){
s1=get0(s2.length()-s1.length())+s1;
}else{
s2=get0(s1.length()-s2.length())+s2;
}
String result="";
int w=0;
for (int i = s2.length()-1; i >=0 ; i--) {
int c=s2.charAt(i)+s1.charAt(i)-96+w;
w=c/10;
result=(c%10) + result;
}
if(w==1)result=1+result;
return result;
}
//大数减法
private static String jian(String s1, String s2) {
String fuhao = "";
if (!check(s1,s2)) {
fuhao = "-";
String t = s1;
s1 = s2;
s2 = t;
}
s2=get0(Math.abs(s1.length()-s2.length()))+s2;
String result="";
int w=0;
for (int i = s1.length()-1; i >=0 ; i--) {
int c=s1.charAt(i)-s2.charAt(i)+w;
if(c<0){
c+=10;
w=-1;
}else{
w=0;
}
result=c+result;
}
result=result.replaceAll("^0+", "");
return fuhao+result;
}
}