實現2個超大數的加法運算,超大數加法運算
一道筆試題~實現2個超大資料的加法運算,這2個超大數,意思就是long也裝不下的數,就頂大概100位吧。
這道題其實看上去很簡單,但是實際上涉及到的知識點還是很多的,非常考驗一個人的程式設計能力和對API的熟悉程度。
思路很簡單,這麼大的數,long都存不下,那隻能存在String中了,然後將每個數字取出,放到數組,由最末位開始計算,算加法,判斷是否進位,進位則前位+1,若超過長度,則copy到新的數組。
下面上代碼:
public class BigInt {private int[] digitals;public BigInt(String inputDigitals) {StringBuffer sb = new StringBuffer(inputDigitals);String string = sb.reverse().toString();digitals = new int[string.length()];for (int i = 0; i < string.length(); i++) {digitals[i] = Integer.valueOf(string.substring(i, i + 1));}}private int[] instance() {return digitals;}public static String bigAdd(BigInt b1, BigInt b2) {String result = "";boolean falg = false;int[] c1;int[] c2;int[] c3 = null;if (b1.instance().length >= b2.instance().length) {c1 = b1.instance();c2 = b2.instance();} else {c1 = b2.instance();c2 = b1.instance();}for (int i = 0; i < c2.length; i++) {if (c1[i] + c2[i] < 10) {c1[i] = (c1[i] + c2[i]);} else if (c1[i] + c2[i] >= 10) {c1[i] = (c1[i] + c2[i] - 10);if ((i + 1) < c1.length) {c1[i + 1] = (c1[i + 1] + 1);} else {falg = true;c3 = new int[c1.length + 1];System.arraycopy(c1, 0, c3, 0, c1.length);c3[c1.length] = 1;}}}if (falg) {for (int i : c3) {result += i;}} else {for (int i : c1) {result += i;}}return new StringBuffer(result).reverse().toString();}}
Test:
public class Test {public static String s2 = "431399914813";public static String s1 = "831399924";public static void main(String[] args) {String result = BigInt.bigAdd(new BigInt(s1), new BigInt(s2));System.out.println(result);}}
結果就不貼了,大家都懂的。
PS :程式中有些地方處理比較煩的原因是字元、byte、int之間的轉化,也許寫的不是很完善,有不妥的地方請指出,寫完後發現,其實這種方法效率上有很大能改善的地方,這裡是將每個字元取出來,其實可以充分利用儲存空間,取多位進行計算,這樣可以更好的提高效率。
c語言大數加法問題,助
用堆棧很容易實現超大數的加減法。
設計大數類可以實現大數的基本加減乘除運算
//樓主還是留個郵箱吧,直接發原始碼給你。。
//加減乘除 模數 冪,大小判斷 賦值 重載。。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class BigNum;
istream& operator>>(istream&, BigNum&);
ostream& operator<<(ostream&, BigNum&);
#define MAXN 9999
#define MAXSIZE 20000
#define DLEN 4
class BigNum
{
public:
int a[MAXSIZE];
int len;
public:
BigNum(){len = 1;memset(a,0,sizeof(a));}
BigNum(const int);
BigNum(const char*);
BigNum(const BigNum &);
BigNum &operator=(const BigNum &);
friend istream& operator>>(istream&, BigNum&);
friend ostream& operator<<(ostream&, BigNum&);
BigNum operator+(const BigNum &) const;
BigNum operator-(const BigNum &) const;
BigNum operator*(const BigNum &) const;
BigNum operator/(const int &) const;
BigNum operator^(const int &) const;
int operator%(const int &) const;
bool operator>(const BigNum & T)const;
bool operator==(const BigNum & T)const;
bool operator==(const int & t)const;
bool operator>(const int & t)const;
};
//////輸入 。。。。。。。。。。。。。。。。
istream& operator>>(istream & in, BigNum & b)
{
char ch[MAXSIZE*4];
int i = -1;
memset(b.a,0,sizeof(b.a));
in>>ch;
int l=strlen(ch);
int count=0,sum=0;
for(i=l-1;i>=0;)
{
sum = 0;
int t=1;
for(int j=0;j<4&&i>=0;j++,i--,t*=10)
{
sum+=(ch[i]-'0')*t;......餘下全文>>