在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,即整數的高位儲存在陣列的高位,整數的低位儲存在陣列的低位。不反過來儲存的原因是,在進行運算的時候都是從整數的低位到高位進行列舉,順位儲存和這種思維相合。但是這也會產生乙個需要...