java大數相加
① java 2個(多個)大整數相加如何實
先自定義一個異常public class LowerException extends Exception{ int score ; public LowException(int score){ super("分數<=0"); this.score = score; } }新建一個類TestException.java然後寫這個拋異常方法:public void validate(int score) throws LowException { if (score <= 0) { throw new LowException(score); } public int inputScore(int score1,int score2 ) { try { validate(score1); validate(score2); int sum = score1+score2; return sum; } catch (LowException e) { System.out.println("進入低分異常"); System.out.println("數太低了,輸入的分數為" + e.score); e.printStackTrace(); } }public static void main(String[] args) { TestException te = new TestException(); double d1 = Double.parseDouble(args[0]);double d2 = Double.parseDouble(args[0]); System.out.println( te.inputScore(d1,d2)); }}你在編譯完畢後。在命令行執行java TestException 參數1 參數2 。記住參數只可以輸數字。不可以輸別的否則出現不可預知的後果。
② JAVA中如何實現兩個任意大的數相加,百位以上。。。。。求大神指點。。。。
把數字用string類型代表就可以了,寫個方法,每次操作string
③ java數組實現大數相加
package com.nileader.big.entity;
public class BigInt {
private String data_str; //原始數據
private int digit; //數據位數
private int[] data; //大數
private boolean carry = false; //進位標識符
/**
* setter and getter
*/
public boolean isCarry() {
return carry;
}
public void setCarry(boolean carry) {
this.carry = carry;
}
public String getData_str() {
return data_str;
}
public void setData_str(String data_str) {
this.data_str = data_str;
}
public int[] getData() {
return data;
}
public void setData(int[] data) {
this.data = data;
}
public int getDigit() {
return digit;
}
public void setDigit(int digit) {
this.digit = digit;
}
//構造方法
public BigInt(){};
public BigInt(String str_data)
{
this.setData_str(str_data);
}
//基本操作
/**
* 形成大數 初始化
*/
public void initBInt()
{
this.setDigit( this.getData_str().length() );
this.data = new int[this.getDigit()];
//將字元組成的大數逆序放入int[] data中
for(int i = 0, j=this.getDigit() ; i
{
// 1104 --> data[0] = '4',data[1] = '0',data[2]=1, data[3]= '1'
this.data[i] = Integer.parseInt( this.getData_str().substring(j-1,j) );
}
}
/**
* 進行大數相加操作
*/
public void add( BigInt bint)
{
//this的位數大於bint的位數
if( this.getDigit() < bint.getDigit() )
{
int[] datatemp = this.getData();
this.setData( bint.getData());
bint.setData( datatemp);
this.setDigit(this.getData().length);
bint.setDigit(bint.getData().length);
}
//將短的那個先加完
int i =0;
for(; i
{
int tdata = 0;
//上次運算有進位
if( this.isCarry())
{
tdata = this.getData()[i] + bint.getData()[i] +1;
//取消進位標識
this.setCarry(false);
}
else tdata = this.getData()[i] + bint.getData()[i] ;
//本次結果無進位
if(tdata <10) this.data[i] = tdata;
//本次結果有進位
else if(tdata >=10)
{
this.data[i] = tdata -10;
this.setCarry(true);
}
} //短的那個加完了
//剩餘數的處理
for(;i
{
//有個進位的
if(this.isCarry())
{
int tdata = this.data[i]+1;
if(tdata >=10) this.data[i] = tdata -10;
else
{
this.data[i] = tdata;
this.setCarry(false);
}
}
}
//對最高位益處檢測
if(this.data[this.getDigit()-1] == 0)
{
int[] tdata = new int[this.getDigit()+1];
System.array(this.getData(), 0, tdata, 0, this.getDigit());
tdata[this.getDigit()] = 1;
this.setData(tdata);
}
}
}
其中代碼段
//對最高位益處檢測
if(this.data[this.getDigit()-1] == 0)
{
int[] tdata = new int[this.getDigit()+1];
System.array(this.getData(), 0, tdata, 0, this.getDigit());
tdata[this.getDigit()] = 1;
this.setData(tdata);
}
④ java怎麼處理大數相加
package eshop.framework.util;
import java.math.BigDecimal;
public class AmountUtil {
// 默認除法運算精度
private static final int DEFAULT_DIV_SCALE = 2;
/**
* 提供精確的加法運算。
*
* @param v1
* @param v2
* @return 兩個參數的和
*/
public static double add(double v1, double v2) {
b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精確的加法運算
*
* @param v1
* @param v2
* @return 兩個參數數學加和,以字元串格式返回
*/
public static String add(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).toString();
}
/**
* 提供精確的減法運算。
*
* @param v1
* @param v2
* @return 兩個參數的差
*/
public static double subtract(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精確的減法運算
*
* @param v1
* @param v2
* @return 兩個參數數學差,以字元串格式返回
*/
public static String subtract(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).toString();
}
/**
* 提供精確的乘法運算。
*
* @param v1
* @param v2
* @return 兩個參數的積
*/
public static double multiply(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供精確的乘法運算
*
* @param v1
* @param v2
* @return 兩個參數的數學積,以字元串格式返回
*/
public static String multiply(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).toString();
}
/**
* 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以後2位,以後的數字四捨五入,舍入模式採用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @return 兩個參數的商
*/
public static double divide(double v1, double v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以後的數字四捨五入。舍入模式採用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位。
* @return 兩個參數的商
*/
public static double divide(double v1, double v2, int scale) {
return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以後的數字四捨五入。舍入模式採用用戶指定舍入模式
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位
* @param round_mode
* 表示用戶指定的舍入模式
* @return 兩個參數的商
*/
public static double divide(double v1, double v2, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, scale, round_mode).doubleValue();
}
/**
* 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 小數點以後10位,以後的數字四捨五入,舍入模式採用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @return 兩個參數的商,以字元串格式返回
*/
public static String divide(String v1, String v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以後的數字四捨五入。舍入模式採用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位
* @return 兩個參數的商,以字元串格式返回
*/
public static String divide(String v1, String v2, int scale) {
return divide(v1, v2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 定精度,以後的數字四捨五入。舍入模式採用用戶指定舍入模式
*
* @param v1
* @param v2
* @param scale
* 表示需要精確到小數點以後幾位
* @param round_mode
* 表示用戶指定的舍入模式
* @return 兩個參數的商,以字元串格式返回
*/
public static String divide(String v1, String v2, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.divide(b2, scale, round_mode).toString();
}
/**
* 提供精確的小數位四捨五入處理,舍入模式採用ROUND_HALF_EVEN
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @return 四捨五入後的結果
*/
public static double round(double v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供精確的小數位四捨五入處理
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @param round_mode
* 指定的舍入模式
* @return 四捨五入後的結果
*/
public static double round(double v, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
return b.setScale(scale, round_mode).doubleValue();
}
/**
* 提供精確的小數位四捨五入處理,舍入模式採用ROUND_HALF_EVEN
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @return 四捨五入後的結果,以字元串格式返回
*/
public static String round(String v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供精確的小數位四捨五入處理
*
* @param v
* 需要四捨五入的數字
* @param scale
* 小數點後保留幾位
* @param round_mode
* 指定的舍入模式
* @return 四捨五入後的結果,以字元串格式返回
*/
public static String round(String v, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(v);
return b.setScale(scale, round_mode).toString();
}
public static String doubleToString(double num, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(num);
return b.setScale(scale, round_mode).toString();
}
}
⑤ java實現兩個大數字相加
特別大的整數可以用BigInteger來實現
要import包java.math.BigInteger
BigInteger a = new BigInteger(\"1111111111111111111\");
BigInteger b = new BigInteger(\"1111111111111111111\");
System.out.println(a.add(b));
更詳細可以查詢J2SE的文檔
⑥ 大數相加,進位問題!! java
for(int i = 0; i< maxLen ; i++){
int tempSum = a[i] + b[i];
sum[i] += tempSum%10;
int d = tempSum/10;
sum[i+1] += d;
}
寫的不對,進位進的方向都不對,應該從最後位開始加。太亂了,直接用Decimal類來做就可以了,沒必要那麼復雜。
格式可以用DecimalFormat類去做,查下API文檔就可以了。