利用字符串和十进制逢10进位的特性实现大数据的算术运算。(加法案例)

java中普通的数据类型int,long等不支持大数据间的算术运算,会出现丢失精度的问题,甚至无法用现有数据类型表示。

例如:对这两个数做加法运算:1243543534646546546465465465464654+32423985348957348957348957348957348574=?

在java中Long类型已经无法表示了,Long类型的最大值为Long.MAX_VALUE=9223372036854775807。

但jdk类库中提供了BigInteger类型,可以解决。

这里我用字符串和十进制运算进位的特性实现下大数的加法运算,其它的运算还没来得及做。

本人的技术一般,懂得东西太少,要学的东西太多,时间实在紧迫,因此博客写的简单些,只把主要的东西将清楚,算留作自己的技术笔记!

代码:

  1 /**
  2  * Project Name:javaBaseReview
  3  * Package Name:com.xuwei.base.algorithm
  4  * author:David
  5  * Date:2015年8月16日上午11:00:53
  6  * Copyright (c) 2015, [email protected] All Rights Reserved.
  7  *
  8  */
  9 package com.xuwei.base.algorithm;
 10
 11 /**
 12  * 利用字符串和十进制进位特性实现大数据之间的算术运算
 13  * @author David
 14  * @since 2015年8月16日 上午11:00:53
 15  * @version
 16  * @since JDK 1.6
 17  */
 18 public class BigInt{
 19     private String valStr;
 20     private int[] val;
 21     /**
 22      * @param string
 23      */
 24     public BigInt(String val) {
 25         int[]val2=null;
 26         val2=str2IntArr(val);
 27         this.val=val2;
 28         this.valStr=val;
 29     }
 30
 31     public String add(String val){
 32         int[]res=null;
 33         res=add(this.val, str2IntArr(val));
 34         return toString(res);
 35     }
 36
 37     public String add(BigInt val){
 38         int[]res=null;
 39         res=add(this.val, str2IntArr(val.toString()));
 40         return toString(res);
 41     }
 42
 43     private String toString(int[] arr){
 44         StringBuilder sb=new StringBuilder();
 45         for(int i=0;i<arr.length;i++){
 46             sb.append(arr[i]);
 47         }
 48         return sb.toString();
 49     }
 50
 51
 52     /**
 53      * 字符串数字转换int数组
 54      * @param val
 55      * @return
 56      */
 57     private int[] str2IntArr(String val) {
 58         char[]ch=val.toCharArray();
 59         int[]toIntArr=new int[ch.length];
 60         for(int i=0;i<ch.length;i++){
 61             toIntArr[i]=Integer.parseInt(ch[i]+"");
 62         }
 63         return toIntArr;
 64     }
 65
 66     /* 加法 */
 67     public int[] add(int[] a, int[] b) {
 68         /* 定义进位值,初始为0 */
 69         int remainder = 0;
 70         /* 定义返回的数组 */
 71         int[] res = null;
 72         int[] c=null;
 73         if(a.length!=b.length){
 74             if(a.length<b.length){//a<b
 75                 res=new int[b.length];
 76                 c=new int[b.length];
 77                 for(int i=c.length-a.length,j=0;i<c.length;i++,j++){
 78                     c[i]=a[j];
 79                 }
 80                 add(c, b, remainder, res);
 81                 return res;
 82             }else{//a>b
 83                 res=new int[a.length];
 84                 c=new int[a.length];
 85                 for(int i=c.length-b.length,j=0;i<c.length;i++,j++){
 86                     c[i]=b[j];
 87                 }
 88                 add(c, a, remainder, res);
 89                 return res;
 90             }
 91
 92         }else{
 93             res=new int[a.length];
 94             add(a, b, remainder, res);
 95             return res;
 96         }
 97     }
 98
 99     //对2个位数相同的数进行加法运算
100     private void add(int[] a, int[] b, int remainder, int[] res) {
101         for (int i = a.length - 1; i >= 0; i--) {
102             res[i] = a[i] + b[i] + remainder;
103             if (res[i] < 10) {
104                 remainder = 0;
105             } else {
106                 remainder = 1;
107                 if(i!=0)
108                     res[i] = res[i]-10;
109             }
110         }
111     }
112
113     @Override
114     public String toString() {
115         return this.valStr;
116     }
117
118
119 }
 1 /**
 2  * Project Name:javaBaseReview
 3  * Package Name:com.xuwei.base.algorithm
 4  * author:David
 5  * Date:2015年6月15日下午6:02:04
 6  * Copyright (c) 2015, [email protected] All Rights Reserved.
 7  *
 8  */
 9 package com.xuwei.base.algorithm;
10
11 import java.math.BigInteger;
12
13 /**
14  * 用字符串实现大数据之间的算术运算
15  *
16  * @author David
17  * @since 2015年6月15日 下午6:02:04
18  * @version
19  * @since JDK 1.6
20  */
21 public class BigCalc {
22     public static void main(String[] args) {
23         Long a=Long.MAX_VALUE;
24         long b=Long.MAX_VALUE;
25         System.out.println(a);
26         System.out.println(a+b);
27
28
29
30 //        BigInt a=new BigInt("239385234454");
31 //        BigInt b=new BigInt("1223234454");
32 //        System.out.println(a.add(b));
33 //
34 //        BigInteger c=new BigInteger("239385234454");
35 //        BigInteger d=new BigInteger("1223234454");
36 //        System.out.println(c.add(d));
37
38     }
39
40 }

测试结果:

测试结果表明运算结果与Jdk的BigInteger算的结果相同!

时间: 2024-10-09 15:36:17

利用字符串和十进制逢10进位的特性实现大数据的算术运算。(加法案例)的相关文章

10个最热门的大数据技术

大数据已经融入到各行各业,哪些大数据技术是最受欢迎?哪些大数据技术潜力巨大?请听大讲台老师对10个最热门的大数据技术的介绍. 互联网科技发展蓬勃兴起,人工智能时代来临,抓住下一个风口.为帮助那些往想互联网方向转行想学习,却因为时间不够,资源不足而放弃的人.我自己整理的一份最新的大数据进阶资料和高级开发教程,大数据学习群:868847735 欢迎进阶中和进想深入大数据的小伙伴加入. (一)预测分析 预测分析是一种统计或数据挖掘解决方案,包含可在结构化和非结构化数据中使用以确定未来结果的算法和技术.

大数据10小时入门Hadoop+HDFS+YARN+MapReduce+Spark视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

利用 Linux 系统生成随机密码的10种方法

通常情况下大家生成密码都好困惑,一来复杂程度不够会不安全,复杂程度够了又不能手动随便敲击键盘打出一同字符(但通常情况下这些字符是有规律的),使用1password 或者 keepass 这种软件生成也可以,不过貌似1password 要收费,既然这样我们就玩一下好玩的用 linux 来生成随机密码玩玩吧; Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,

十六进制字符串转十进制整数

十六进制字符串转十进制整数 编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回. #include <iostream> using namespace std; // 十六进制字符串的最大长度 #define MAX_HEX_STR_LEN 100 bool hexToDec(char shex[], int & idec) { size_t i = 0, len = 0; int mid = 0; l

数组-05. 字符串字母大小写转换(10)

输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变. 输入格式: 输入在一行中给出一个长度不超过40的.以#结束的非空字符串. 输出格式: 在一行中按照要求输出转换后的字符串. 输入样例: Hello World! 123# 输出样例: hELLO wORLD! 123 import java.util.Scanner; public class Main { public static void main(String[] args) {

shell脚本,在指定目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件。

[[email protected] wyb]# cat test10.sh #!/bin/bash #使用for循环在/test10目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件 dir=/root/wyb/test10/ [ ! -d $dir ] && mkdir -p $dir for i in `seq 10` do touch $dir`echo $RANDOM|md5sum|cut -c 1-10`_oldboy.html done [[ema

06-2. 字符串字母大小写转换(10)

输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变. 输入格式: 输入在一行中给出一个长度不超过40的.以#结束的非空字符串. 输出格式: 在一行中按照要求输出转换后的字符串. 输入样例: Hello World! 123# 输出样例: hELLO wORLD! 123 1 #include <stdio.h> 2 3 int main() 4 { 5 char s[40]; 6 int i = 0; 7 do { 8 scanf(&qu

已知rand7()&#160;可以产生1~7的7个数(均匀概率),利用rand7()产生rand10()1~10(均匀概率)

题目:已知rand7() 可以产生1~7的7个数(均匀概率),利用rand7()产生rand10()1~10(均匀概率). 解析:首先利用rand7()产生1-5的5个数,每个数的概率为1/5,然后在这5个数的基础上再以1/2的概率加上5,这样就能以1/10的概率产生每一个数. 答案: int rand10() { int tmp1,tmp2; do { tmp1=rand7(); }while(tmp1>5); do { tmp2=rand7(); }while(tmp2>2); retur

编程算法基地-2.1利用字符串API

2.1利用字符串API 字符串是Java类型最常用.并且是复合类型 串非常经常用于,其最佳API熟悉文档. 推断串中有没有反复的字符 String s ="abcdebxyz"; 推断当中有没有反复字符 /*推断串中有没有反复的字符 String s ="abcdebxyz"; 推断当中有没有反复字符*/ package StringAPI; public class JudgeRepeatInString { public static void main(Str