之所以會做用演算法做大數的四則運算是因為在參加藍橋杯比賽的時候被兩道大數題給坑慘了,因為訓練的時候沒做過大數的題,在這上面吃了大虧,回來後痛定思痛,在網上找了一些方法,才發現有bigdecimal和biginteger這兩個api類可以完美解決我的問題,我自然很好奇,於是在網上找到了這兩個類的原始碼來看,結果越看越頭痛,整個原始碼沒法在我心中有乙個完整的結構,後來突然內心一動,為什麼不自己來寫乙個類似的api類呢?這個想法出來後就在心裡一發不可收拾,越加無法控制,說動就動。
類名:bignum
功能:實現整數大數的五則運算,同時該類使用了comparable介面,可以進行排序比較
屬性:num:存放表示大數的陣列
sign:存放大數的正負號
digits:存放大數的位數
所有屬性均為final,不可修改
構造方法:
bignum(string number);使用傳入的字串轉換成int型陣列,會過濾掉開頭的零和非數字以及非正負號以外的其它所有符號,會忽略小數點及小數點後的所有字元,以最後一次出現的「-」「+」為該大數符號,如未指定則預設為「+」,如果字串為null或空將會丟擲異常
bignum(int numarr, char sign);過濾傳入的int型陣列的開頭的零,傳給num,如果陣列中的數字超過一位將拆分為多位數,將sign傳給sign,如果numarr為空,或者sign不為正負號將丟擲異常
主要方法:
add:加
sub:減
mul:乘
div:除
rem:取餘
以及一些具體做運算的方法,將在講到加減乘除這些方法時一併講
其它方法:
public static int stringtointarr(string s);將傳入的字串轉換成int陣列,該方法為靜態方法,會過濾掉開頭的零和非數字,會忽略小數點及小數點後的所有字元。
public static string intarrtostring(int arr);將傳入的int陣列轉換成字串,該方法為靜態方法。
public int compareto(bignum num);比較兩個bignum物件的大小,包括符號,若當前物件小於,等於,大於num,則返回負整數,零,正整數
private int arrcompare(int a, int b);大數陣列同位數下比較大小,無符號,若a小於,等於,大於b,則返回負整數,零,正整數
private int intarrcompaerto(int numa, int numb);判斷兩個大數陣列的大小,無符號,若numa小於,等於,大於numb,則返回負整數,零,正整數
public string tostring();重寫tostring,將num陣列轉換成字串,同時在前面加上符號,正號預設不加。
貼上**:
最後,為了避免太長,我將會寫成乙個系列~~接下來將會對五則運算逐個詳解(其實是為了多兩篇文章。。。)public class bignum implements comparable
char numchar = number.tochararray();
char sign = 0;
//從左往右獲取輸入的值
for (int i = 0; i < numchar.length; i++)
}if (sign == 0)
num = stringtointarr(number);
sign = sign;
digits = num.length;
}public bignum(int numarr, char sign) throws exception
if (sign != '-' && sign != '+')
sign = sign;
num = stringtointarr(intarrtostring(numarr));
digits = num.length;
}public static int stringtointarr(string s)
if (numchar[i] == 46)
if (numchar[i] > 47 && numchar[i] < 58)
}if (flag)
char tempchararr = sb.tostring().tochararray();
int num = new int[tempchararr.length];
for (int j = 0; j < num.length; j++)
return num;
}public static string intarrtostring(int arr)
flag = false;
}if (flag)
return sb.tostring();
}/**
* 比較兩個bignum物件的大小,包括符號。
* 若當前物件小於,等於,大於比較物件,則返回負整數,零,正整數
** @param num
* @return
*/@override
public int compareto(bignum num)
if (num == null)
if (sign < num.sign) else if (sign > num.sign) else else if (digits < num.digits) else
} else else if (digits < num.digits) else }}
}/**
* 大數陣列同位數下比較大小,無符號。
* 若a小於,等於,大於b,則返回負整數,零,正整數
** @param a
* @param b
* @return
*/private int arrcompare(int a, int b) else if (a[i] < b[i])
}return 0;
}/**
* 判斷兩個大數陣列的大小,無符號。
* 若當前陣列小於,等於,大於比較陣列,則返回負整數,零,正整數
** @param numarr
* @return
*/private int intarrcompaerto(int numa, int numb)
if (numa.length > numb.length) else if (numa.length < numb.length) else
}@override
public string tostring()
大數四則運算之減法運算 c語言版
分三種情況 1.減數長度大於被減數 交換減數與被減數,輸出負號,方便減 2.減數長度等於被減數 分三種情況 a.減數大於被減數,類似1情況1 b.減數等於被減數,兩數相等,直接輸出0,完成。c.減數小於被減數 3.減數長度小於被減數 include include intmain if strlen...
用java實現簡單四則運算的演算法
例如 12 3 2 3 5 2 72 應用場景 在計算器中輸入一大串四則運算表示式,如何按下 號,得出對應的正確結果,今天就來完成該功能的實現。首先拿到乙個表示式後,我們如果按照人的計算方式,有括號 在有括號的情況下,先計算得出括號中的結果。沒有括號 運算按照 先乘除,後加減進行。沒有括號表示式的實...
面試100題系列之13大數的四則運算
兩個字串相加 str1和str2是加數,ans是結果陣列,nmaxlen是結果陣列的最大空間 char add char const str1,char const str2,char ans,int nmaxlen else if str1 0 一正一負 else if str2 0 int nl...