大整數的運算實現

2021-04-20 00:04:57 字數 2281 閱讀 7927

在csdn看到有人提出關於大數加法的實現問題,想起在學資料結構時有個課程設計是「鍊錶實現大整數的運算」,當時看到就畏懼,如今是躍躍欲試。便嘗試去實現下,由於課本還托在樓管那,不了解具體的要求,就先用非鍊錶形式實現之。stl中的string拿來用之,順便熟悉下。後發覺比字元陣列好用多了。對於記憶體管理應更透明,儘管動態地、隨便用它。

在程式設計過程中,發覺寫**的正確率實在過低。有時儘管思想出來了,但是具體落實到程式設計上,卻老是會有bug。而其中問題往往是非邏輯性的,是些小毛病。有些甚至要新增大量的cout才得以除錯成功。 希望多加練習,能花盡量少的時間,寫出正確漂亮的**!

關於大整數的運算,包括 +,-,*,/。其中大整數字數可以是max (int) 也即string容量。理所當然,先實現加減。+->->*>/。

其中除法實現最久了,起初用最簡單的方法,迴圈減去除數,得出結果。單處理111111111111111111111111/1時,機子就卡那很久。太爛了!便想著換掉。後來用到手算時的思想。效率可以提高很多,至少可以基本滿足要求:隨便輸入,都可較快得到結果。

望路過者有疑問或好的建議,可以交流一二,無比感激!

//*************************== 

//用string 處理大數的運算: +,-,*,/,... 

//input: num1 + num2 //需要有間隔

//ouput: result 

// by kasmile

#include 

#include 

using

namespace std;

string operate(string a,string operation,string b);

string add(string a,string b);

string sub(string a,string b);

bool great(string a,string b);

string mul(string a,string b);

string div(string a,string b);

int main()

string operate(string a,string operation,string b)

}string add(string a,string b)

int t = 0;//進製標誌 

int i = a.size() - 1,j = b.size() - 1;

for(;i > j; j++)

for(;i >= 0; i--,j--)

} return t? "1" + a: a;

}bool great(string a,string b)

if(i < a.size())

return

false;

return

true;        }}

string sub(string a,string b)

int i = a.size() - 1,j = b.size() - 1;

for(;i > j; j++)

int t = 0;//借位標誌 

for(;i >= 0; i--,j--)

b[j] =d + 48;

} string::iterator iter = b.begin();

for(; (iter + 1) != b.end() && (*iter == '0');)

return flag? "-" + b: b;

}string mul(string a,string b)

for(int i = 1; i <= total - n; i++)

result = add(temp,result);

}return result;}/*

string div(string a,string b)

return "商: "+s+" 餘: "+result;}*/

string div(string a,string b)

for(; a != "0" && great(a,b);)

for(; great(a_temp,mul(b,s_temp));) 

s_temp = sub(s_temp,"1");

for(; a_b > 0; a_b--)

a = sub(a,mul(b,s_temp));//剩餘未除的數 

s = add(s,s_temp);//商的結果 

}return

"商: "+ s +" 餘: "+a;

}

超長整數運算(大整數運算)

問題描述 將形如1234567890123456789不能儲存在long變數中的數稱為超長整數或大整數。現討論大整數的加減乘除運算。思想方法 用陣列儲存超長整數,且為處理的簡單起見約定每個元素存放相同位的數字。如 每個元素存放4位。1 加法運算 void add int a,int b,int c ...

大整數的運算

整體套路還是字串模擬 首先判斷大數的符號 同號相加,異號相減 判斷符號 fa a 0 fb b 0 異號為減,同號為加 if fa fb minus a,b else add a,b 處理同號 對同號的處理就是模擬相加 模擬就要考慮到加法運算的問題,順序我們是沒法進行正常的邏輯加運算的,所以要處理下...

大整數的運算

用陣列儲存即可 如將整數235813儲存到陣列中,則有d 0 3,d 1 1,d 2 8,d 3 5,d 4 3,d 5 2,即整數的高位儲存在陣列的高位,整數的低位儲存在陣列的低位。不反過來儲存的原因是,在進行運算的時候都是從整數的低位到高位進行列舉,順位儲存和這種思維相合。但是這也會產生乙個需要...