java数字相减_java实现大数字的加减乘除

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 ,并且tempb.然后m=m-temp ,当mc.当前次的result=i00…(k个0)

d.循环执行直到m如: 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=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()=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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值