我本身想寫**實現整數型大資料的加減乘除和求餘,結果寫著寫著想著連小數運算的也一起寫上(反正加的**不多)
電腦是死的,人是活的,當資料超出範圍時,我們可以想其他方法去算,在這裡,我使用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...