題目描述
對一道A+B的題目,如果A和B的範圍在int範圍內,那麼相信大家很快就能寫出程序。但是如果A和B是有着1000個數位的整數,恐怕就沒有辦法用已有的數據類型來表示了,這時就只能老實去模擬加減乘除的過程。
解題思路:
使用數組來存儲整數字符串,然後低位存放低位,高位存放高位
在進行大整數加減運算的時候,
若出現負數,則在最後輸出的時候,添加負號即可
#include<iostream>
using namespace std;
#include<string>
struct bign
{
int d[1000];
int len;
bign() {
memset(d,0,sizeof(d));
len = 0;
}
};
bign change(string str) {//將整數轉換爲bign
bign big;
int len = str.size();
big.len = len;
for (int i = 0; i < len; i++) {
big.d[i] = str[len - i - 1] - '0';//將str數組高位放在bign數組的高位
}
return big;
}
int compare(bign b1,bign b2) {//比較大小
if (b1.len > b2.len) {
return 1;
}
else if (b1.len < b2.len) {
return -1;
}
else
{
for (int i = b1.len - 1; i >= 0; i--) {//從高位往地位比較
if (b1.d[i] > b2.d[i]) {
return 1;
}
else
{
return -1;
}
}
}
return 0;
}
bign add(bign b1,bign b2) {//加法,默認正整數
bign big;
int carry = 0;//表示進位
for (int i = 0; i < b1.len || i < b2.len; i++) {
int temp = b1.d[i] + b2.d[i] + carry;
big.d[big.len++] = temp % 10;
carry = temp / 10;
}
if (carry != 0) {
big.d[big.len++] = carry;//進位不爲零,直接加到最高位
}
return big;
}
bign sub(bign b1,bign b2) {//減法,默認都爲正整數且b1 > b2
bign big;
int carry = 0;//借位:0表示不借位,1表示借位
for (int i = 0; i < b1.len || i < b2.len; i++) {
if (b2.d[i] <= b1.d[i] - carry) {//當前位夠減
big.d[big.len++] = b1.d[i] - carry - b2.d[i];
carry = 0;
}
else//當前位不夠減
{
big.d[big.len++] = b1.d[i] - carry + 10 - b2.d[i];
carry = 1;
}
}
while (big.len >= 1 && big.d[big.len - 1] == 0)//去掉最高位的0
{
big.len--;
}
return big;
}
//高精度與低精度的乘法
bign multi(bign b,int num) {
bign big;
int carry = 0;//進位
for (int i = 0; i < b.len; i++) {
int temp = b.d[i] * num + carry;
big.d[big.len++] = temp % 10;
carry = temp / 10;
}
while (carry != 0)//乘法可能有多位進位
{
big.d[big.len++] = carry % 10;
carry /= 10;
}
return big;
}
//高精度與低精度除法
bign divide(bign b, int num, int& r) {//r爲餘數
bign big;
big.len = b.len;//商的位數與被除數的位數相同
for (int i = b.len - 1; i >= 0; i--) {
r = r * 10 + b.d[i];//每一次新的被除數
if (r < num) {//不夠除
big.d[i] = 0;
}
else {//夠除
big.d[i] = r / num;
r = r % num;//新的餘數
}
}
//去掉高位的零
while (big.len - 1 >= 1 && big.d[big.len-1] == 0)//保證結果至少有一位
{
big.len--;
}
return big;
}
void printBign(bign big) {
for (int i = big.len - 1; i >= 0; i--) {
cout << big.d[i];
}
cout << endl;
}
//大整數的四則運算
int main() {
//string str1,str2;
//cin >> str1 >> str2;
string str1;
int num;
cin >> str1 >> num;
bign b1 = change(str1);
//bign b2 = change(str2);
//bign big = add(b1,b2);
//bign big = sub(b1,b2);
//bign big = multi(b1,num);
int r = 0;
bign big = divide(b1,num,r);
printBign(big);
cout << "餘數爲:" << r << endl;
system("pause");
return 0;
}