目录
高精度加法
#define MAX 100
int arr1[MAX], arr2[MAX];
string s;
void addition(int arr1[], int arr2[])
{
int len1, len2;
int t;
cin >> s; len1 = s.size();
for (int i = 0; i < len1; i++) arr1[i] = s[s.size() - 1 - i] - '0';//字符串倒叙导入数组
cin >> s; len2 = s.size();
for (int i = 0; i < len2; i++) arr2[i] = s[s.size() - 1 - i] - '0';
//求长度len
int len = (len1 > len2) ? len1 : len2;
//加法运算
for (int i = 0; i < len; i++) {
arr1[i] += arr2[i];
arr1[i + 1] += arr1[i] / 10;
arr1[i] %= 10;
}
if (arr1[len] != 0) len++;//最后一位考虑是否进位
//输出
for (int i = 0; i < len; i++) cout << arr1[len - 1 - i];
}
//计算后len为数组长度,arr1[]为计算后得到的数组
高精度减法
#define MAX 100
int arr1[MAX], arr2[MAX];
string s1,s2;
int len;
int compare(string s1, string s2)//s1>=s2 返回0; s1<s2 返回1
{
if (s1.size() > s2.size()) return 0;
if (s1.size() < s2.size()) return 1;
for (int i = 0; i <= s1.size(); i++) { if (s1[i] > s2[i]) return 0; if (s1[i] < s2[i]) return 1; }
return 0;
}
void subtraction() {
cin >> s1 >> s2;
int len1 = s1.size(), len2 = s2.size();
for (int i = 0; i < len1; i++) arr1[i] = s1[len1 - i - 1] - '0';//字符串倒序导入数组
for (int i = 0; i < len2; i++) arr2[i] = s2[len2 - i - 1] - '0';
if (compare(s1, s2) == 0) {//s1>=s2的情况
len = len1;
for (int i = 0; i < len1; i++) {//减法运算
arr1[i] -= arr2[i];
if (arr1[i] < 0) { arr1[i + 1]--; arr1[i] += 10; }
}
len++;
while (arr1[len-1] == 0 && len > 1) len--;//去掉运算后数字前面的零
//输出
for (int i = len - 1; i >= 0; i--) cout << arr1[i];
}
else {//s1<s2的情况
len = len2;
for (int i = 0; i < len2; i++) {
arr2[i] -= arr1[i];
if (arr2[i] < 0) { arr2[i + 1]--; arr2[i] += 10; }
}
len++;
while (arr2[len] == 0 && len > 1) len--;//去掉运算后数字前面的零
//输出
cout << "-";//注意此时要加负号
for (int i = len - 1; i >= 0; i--) cout << arr2[i];
}
}
//计算后len为数组长度,若s1>=s2,arr1[]为计算后得到的数组,若s1<s2,arr2[]为计算后得到的数组(此时要在数组前加上负号)
高精度乘法
#define MAX 100
int arr1[MAX], arr2[MAX], arr[MAX * 2];//注意数组长度
string s1,s2;
int len;
void multiplication() {
cin >> s1 >> s2;
int len1 = s1.size(), len2 = s2.size();
for (int i = 0; i < len1; i++) arr1[len1 - i] = s1[i] - '0';
for (int i = 0; i < len2; i++) arr2[len2 - i] = s2[i] - '0';
for (int i = 1; i <= len1; i++) {
int t = 0; //存放进位
for (int j = 1; j <= len2; j++) {
arr[i + j - 1] = arr1[i] * arr2[j] + t + arr[i + j - 1];当前乘积+上次乘积进位+原数
t = arr[i + j - 1] / 10;
arr[i + j - 1] %= 10;
}
arr[i + len2] = t; //进位
}
len = len1 + len2;
while (arr[len] == 0 && len > 1) len--;//删除前导零
for (int i = len; i >= 1; i--) cout << arr[i];
}
//计算后len为数组长度,arr[]为计算后得到的数组
高精度除法
高精除以单精
#define MAX 100
int a[MAX], arr[MAX];//数组a是除数,整数b是被除数
int b;
string s;
int len;
void division() {
cin >> s;
cin >> b;
len = s.size();
for (int i = 0; i < len; i++) a[i + 1] = s[i] - '0';//除法运算要正序放入
int t = 0;
for (int i = 1; i <= len; i++) {//按位相除
arr[i] = (t * 10 + a[i]) / b;
t = (t * 10 + a[i]) % b;
}
int len_start = 1;
while (arr[len_start] == 0 && len_start < len) len_start++;//删除前导零
for (int i = len_start; i <= len; i++) cout << arr[i];
}
//计算后len为数组长度,arr[]为计算后得到的数组
高精除以高精
//arr1为被除数,arr2为被除数,计算后arr为商,arr1为余数
//arr1[0]为arr1的长度,arr2[0]为arr2的长度,arr[0]为arr的长度,temp[0]为temp长度。
#define maxn 100
int arr1[maxn], arr2[maxn], arr[maxn], temp[maxn];
string s1, s2;
int compare(int a[], int b[])//比较a、b,若a>b为1;若a<b为-1;若a=b为0
{
if (a[0] > b[0]) return 1;
if (a[0] < b[0]) return -1;
for (int i = a[0]; i > 0; i--)//从高位到低位比较
{
if (a[i] > b[i]) return 1;
if (a[i] < b[i]) return -1;
}
return 0;
}
void subduction(int a[], int b[])//计算a=a-b
{
if (compare(a, b) == 0)//相等
{
a[0] = 0;
return;
}
if (compare(a, b) == 1)//大于
{
for (int i = 1; i <= a[0]; i++)
{
if (a[i] < b[i])//若不够向上借位
{
a[i + 1]--;
a[i] += 10;
}
a[i] -= b[i];
}
while (a[0] > 0 && a[a[0]] == 0) a[0]--;//删除前导0
}
}
void division() {
cin >> s1 >> s2;
arr1[0] = s1.size();
arr2[0] = s2.size();
for (int i = 1; i <= arr1[0]; i++)
arr1[i] = s1[arr1[0] - i] - '0';
for (int i = 1; i <= arr2[0]; i++)
arr2[i] = s2[arr2[0] - i] - '0';
arr[0] = arr1[0] - arr2[0] + 1;
for (int i = arr[0]; i > 0; i--)
{
memset(temp, 0, sizeof(temp));
for (int j = 1; j <= arr2[0]; j++)//从i开始的地方,复制数组b到数组temp
temp[j + i - 1] = arr2[j];
temp[0] = arr2[0] + i - 1;
while (compare(arr1, temp) >= 0)//减法模拟
{
arr[i]++;
subduction(arr1, temp);
}
}
while (arr[0] > 0 && arr[arr[0]] == 0) arr[0]--;//删除前导0
//输出
cout << "商为:";
if (arr[0] == 0) { arr[1] = 0; arr[0] = 1; }
for (int i = arr[0]; i > 0; i--) cout << arr[i]; cout << endl;
cout << "余数为:";
if (arr1[0] == 0) { arr1[1] = 0; arr1[0] = 1; }
for (int i = arr1[0]; i > 0; i--) cout << arr1[i]; cout << endl;
}
//计算后arr[]为商,arr1[]为余数,arr[0]为arr的长度,arr1[0]为arr1的长度