用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845
因为JAVA语言中的long
定义的变量值的最大数受到限制,例如123456789987654321这样的整数就不能存放在long类型的变量中,如果这样两个大数相加或相乘,产生的结果会更大。比如,JAVA语言中如果使用long
l = 1000000000这样定义没错,但如果加上2000000000变成
1000000000+2000000000测试结果就为-1294967296,
成了负数。原因就是结果数太大,无法表示此结果数。那么怎样做才能把上述计算题给解答出来呢?
这里我们采用阵列法,比如 
long  a = 123456789876
long  b = 123412341234
首先我们可以定义二个数组,分组存放这些数字
long ary_a[3];
long ary_b[3];
可以把这两个数分别分解为三个部分,每个部分都是四位,也就是:
ary_a [0] = 1234;
ary_a [1] = 5678;
ary_a [2] = 9876;
ary_b [0] = 1234;
ary_b [1] = 1234;
ary_b [2] = 1234;
接下来的事情就是进位了
来一个小点的数,比如 38 + 25 分解一下
个位相加 8+5=13 需进位 , 结果的个位为3
十位相加 1+3+2 = 6
可以得到一个规律
进位数 = 13 / 10
个位所留下来的位 = 13 % 10
程序中如下实现
public class Test1 {
public static void main(String[] args) {
int a = 38;
int b = 25;

int[] ary_a = {3, 8};
int[] ary_b = {2, 5};

int r_1 = ary_a[0] + ary_b[0];
int r_2 = ary_a[1] + ary_b[1];

/* r_1 = 5, r_2 = 13 */
System.out.println(r_1);
System.out.println(r_2);

/* 结果的进位 */
int carry = r_2 / 10;
System.out.println(carry);

/* 结果的个位 */
int g = r_2 % 10;
System.out.println(g);

/* 十位 */
int s = carry+r_1;
System.out.println(s);

/*结果为63*/
System.out.println(s+""+g);

}
}

如果是三位数,以此类推
下面给出简单示例
package com;
public class BigNumberOperation {

/*加法*/
public int[] add(int[] f, int[] s, int n) {

/*定义余数,初始为0*/
int carry = 0;

/*定义返回的数组*/
int[] c = new int[f.length];
/*遍历传入的两个数组,分别计算*/
for(int i = f.length - 1; i >= 0; i--) { 
c[i] = f[i] + s[i] + carry; 
if(c[i] < n) {
carry = 0; 
}
else { 
c[i] = c[i] - n; 
carry = 1; 
}

return c;
}

/*乘法,b为以内的数*/
public int[] mul(int[] a, int b) { 
int carry = 0;

int[] c = new int[a.length];

if(b>10) {
return c;
}

for(int i = a.length - 1; i >=0; i--) { 
int tmp = a[i] * b + carry; 
c[i] = tmp % 10;
carry = tmp / 10; 

return c;
}

/* 字符串转为整型数组 */
public int[] getInts(String s) {
int[] temp = null;
if(s!=null && s.length()>0){
temp = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
temp[i] = Integer.parseInt(s.substring(i,i+1));
}
}
return temp;

}

/* 测试 */

public static void main(String[] args) {
BigNumberOperation bno = new BigNumberOperation();

/* 两个整数数组 */

int[] f = {1234,3242,3432,4};

int[] s = {8938,4590,4354,5};

/* 调用两数相加的方法 */
int[] t = bno.add(f, s, 100000);

StringBuffer sb = new StringBuffer();

/* 结果添加到StringBuffer */
for (int j = 0; j < t.length; j++) {
sb.append(t[j]);
}
System.out.println(sb.toString());
int[] bb = bno.getInts(sb.toString());

/* 乘法 */
bb = bno.mul(bb, 5);

/* 输出结果 */
for (int i = 0; i < bb.length; i++) {
System.out.print(bb[i]);
}
System.out.println();
}
}
}

后面加的那个小数就很简单了
343434343432.59845
在JAVA中也可以使用
java.math.BigDecimal
java.math.BigInteger
来进行大数运算

java 大数运算[转]的更多相关文章

  1. 收藏的一段关于java大数运算的代码

    收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...

  2. JAVA大数运算

    java大数是个好东西,用起来方便,代码短. 代码如下: import java.util.*; import java.math.*; public class Main { public stat ...

  3. java大数运算(讲解)

    在算法竞赛或者面试中我们经常遇到大数问题,例如求一个很大的阶层,大数加法等等. 住在这种情况下我们用常规解法(使用long long或long long int)肯定是不行的, 而我们自己用c/c++ ...

  4. java 大数运算,高精度模板

    转自:https://blog.csdn.net/stffer/article/details/46382949 有修改 关于BigInteger类更详细的用法请移步官方文档 package prac ...

  5. Java 大数运算

    import java.util.*; import java.math.*; public class Main{ public static void main(String args[]){ S ...

  6. 大数运算之 Java BigInteger 的基本用法

    大数运算之 Java BigInteger 的基本用法 在程序设计竞赛中会遇到高精度运算的问题,C++没有高精度运算,只能手动模拟人工运算,手动实现高精度,而 java.math 包中的 BigInt ...

  7. java 大数计算

    这几天做了几道用大数的题,发现java来做大数运算十分方便.对acmer来说是十分实用的 1.valueOf(parament); 将参数转换为制定的类型 比如 int a=3; BigInteger ...

  8. java大数

    java大数还是很好用的! 基本加入: import java.math.BigInteger; import jave.math.BigDecimal; 分别是大数和大浮点数. 首先读入可以用: S ...

  9. java大数--总结

    BigInteger(高精度整数) 1.所在包: java.math.BigInteger 2.大数运算,以下返回类型均为BigInteger BigInteger a; BigInteger b; ...

随机推荐

  1. Java String 常量池理解

    String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字 ...

  2. Spring Cloud分布式微服务云架构

    分布式.微服务.云架构 JAVA语言开发.跨平台.高性能.高可用.安全.服务化.模块化.組件化.驱动式开发模式 commonservice eurekaNetflix 云端服务发现,一个基于 REST ...

  3. 使用turtle画故宫(伍奇,侯俊豪小组)

    这个代码主要有两个部分,第一部分是画出故宫,第二部分是用random函数随机画心,故宫部分设置多个函数和循环再进行颜色填充即可完成. 此处为视频链接 from turtle import* impor ...

  4. Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 阅读笔记

    Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks (使用循环一致的对抗网络的非配对图像-图 ...

  5. Python机器学习(python简介篇)

    1.Python 数据类型 Python 内置的常用数据类型共有6中: 数字(Number).布尔值(Boolean).字符串(String).元组(Tuple).列表(List).字典(Dictio ...

  6. linux install ftp server

    first  yum install vsftpd 第二部:vi /etc/vsftpd/vsftpd.conf 添上下面一段话 anonymous_enable=YESlocal_enable=YE ...

  7. golang对不同系统的编译

    Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能. Mac下编译 # mac编译linux执行文件 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go ...

  8. mac 下mysql安装

    系统环境: OS X Yosemite 10.10.3 登录用户: fx (有 sudo 权限) MySQL版本: 5.5.49 (mysql-5.5.49-osx10.9-x86_64.tar) M ...

  9. org.hibernate.AssertionFailure: null id in xxx entry (don't flush the Session after an exception occurs)

    网上找了很久,发现造成原因有很多种,后来终于发现了端倪:看提示是发生了异常,查看业务代码,发现有这个逻辑:先插入记录,如果有唯一键约束异常(并发造成),catch时查询已存在的记录,查询的时候就报了此 ...

  10. 二进制32位转十进制int

    public class BinaryToDecimal { public static int BinaryToDecimal(int binaryNumber){ int decimal = 0; ...