C 實現大數運算(加減乘除求餘)

2021-08-22 12:12:00 字數 4597 閱讀 1857

我本身想寫**實現整數型大資料的加減乘除和求餘,結果寫著寫著想著連小數運算的也一起寫上(反正加的**不多)

電腦是死的,人是活的,當資料超出範圍時,我們可以想其他方法去算,在這裡,我使用string類來存資料,string類的容量足夠大,相信夠一般大資料使用了吧。

main.cpp

#include #include#include#include "large.h"

using namespace std;

int main()

return 0;

}

large.h

#include #includeusing namespace std;

class large

large(string m_str1, char m_ch, string m_str2); //兩數的運算

inline int compare(string str1, string str2); //相等返回0,大於返回1,小於返回-1

string sub_int(string str1, string str2); //高精度減法

string add_int(string str1, string str2); //高精度加法

string mul_int(string str1, string str2); //高精度乘法

string divide_int(string str1, string str2, int flag); //高精度除法,flag==1,返回商;flag==0時,返回餘數

string div_int(string str1, string str2); //高精度除法,返回商

string mod_int(string str1, string str2); //高精度除法,返回餘數

large(large &e); //拷貝構造

~large(){}; //析構函式

};

large.cpp

#include #include#include#include "large.h"

using namespace std;

large::large(string m_str1, char m_ch, string m_str2)//兩數的運算

} else

else

m_res = add_int(m_str1, m_str2);

m_istr = m_res.length();

for (int i = 0; i < m_ilocation3; i++)

m_istr = m_istr - 1;

m_res.insert(m_istr, ".");

break;

case'-':

if (m_ilocat >= 0)

else

m_res = sub_int(m_str1, m_str2);

m_istr = m_res.length();

for (int i = 0; i < m_ilocation3; i++)

m_istr = m_istr - 1;

m_res.insert(m_istr, ".");

break;

case'*':

m_ilocation3=m_ilocation1+m_ilocation2;

m_res = mul_int(m_str1, m_str2);

m_istr = m_res.length();

for (int i = 0; i < m_ilocation3; i++)

m_istr = m_istr - 1;

m_res.insert(m_istr, "."); break;

case'/':

if (m_ilocat >= 0)

else

m_res = div_int(m_str1, m_str2); break;

case'%':

m_res = mod_int(m_str1, m_str2); break;

default:

break;

} } cout << endl;

cout << m_res << endl;

}inline int large::compare(string str1, string str2) //相等返回0,大於返回1,小於返回-1

string large::add_int(string str1, string str2) //高精度加法

else //負正

}else

else //正正,把兩個整數對齊,短整數前面加0補齊

else

int int1 = 0, int2 = 0; //int2記錄進製

for (i = str1.size() - 1; i >= 0; i--)

if (int2 != 0)str = char(int2 + '0') + str;

} }//運算子處理符號

if ((sign == -1) && (str[0] != '0'))str = "-" + str;

return str;

}string large::sub_int(string str1, string str2) //高精度減法

else

string::size_type tempint;

tempint = str1.size() - str2.size();

for (i = str2.size() - 1; i >= 0; i--)

else

}str = char(str1[i + tempint] - str2[i] + ':') + str;

}else

}for (i = tempint - 1; i >= 0; i--)

str = str1[i] + str;

} //去出結果中多餘的前導0

str.erase(0, str.find_first_not_of('0'));

if (str.empty())str = "0";

if ((sign == -1) && (str[0] != '0'))str = "-" + str;

return str;

}string large::mul_int(string str1, string str2) //高精度乘法

if (str2[0] == '-')

int i, j;

string::size_type l1, l2;

l1 = str1.size();

l2 = str2.size();

for (i = l2 - 1; i >= 0; i--) //模擬手工乘法豎式

if (int2 != 0)tempstr = char(int2 + '0') + tempstr;

} str = add_int(str, tempstr);

} //去除結果中的前導0

str.erase(0, str.find_first_not_of("0"));

if (str.empty())str = "0";

if ((sign == -1) && (str[0] != '0'))str = "-" + str;

return str;

}string large::divide_int(string str1, string str2, int flag) //高精度除法,flag==1,返回商;flag==0時,返回餘數

if (str1 == "0") //判斷被除數是否為0

if (str1[0] == '-')

if (str2[0] == '-')

int res = compare(str1, str2);

if (res < 0)

else if (res == 0)

else

}} residue = tempstr;

} //去除結果中的前導0

quotient.erase(0, quotient.find_first_not_of("0"));

if (quotient.empty())quotient = "0";

if ((sign1 == -1) && (quotient[0] != '0'))quotient = "-" + quotient;

if ((sign2 == -1) && (residue[0] != '0'))residue = "-" + residue;

if (flag == 1)return quotient;

else

return residue;

}string large::div_int(string str1, string str2) //高精度除法,返回商

string large::mod_int(string str1, string str2) //高精度除法,返回餘數

這下子就不怕資料超出範圍了,歡迎一起**,一起交流。

shell算術運算 加減乘除求餘

1.使用 num expr 數值1 符號數值2 數值1與數值2還有符號之間需要空格 數值1 空格 符號 空格 數值2 bin bash echo 使用expr echo 加法 num1 expr 5 4 echo num1 echo echo 減法 num2 expr 5 4 echo num2 e...

大數運算(加減乘除)

加法 void add char a,char b,char d for i len i 1 i if c i 48 len else break for i 0 i len i d i c len i view code 減法1 d2 d1,如果需要比較大小自己加乙個不麻煩。void dec ch...

大數運算 加減乘除

大數運算產生的原因就是因為int,double型別表示範圍都有限,無法表示過長的數字比如 2345468454567865415467864453437。因此也就無法進行四則運算,為了實現這種運算,大數運算產生了。其實也很簡單,既然基本資料型別放不下這些資料,那就用陣列存放唄。定義char c 10...