大整数乘法(不考虑负数)
#include<iostream>
#include<string>
using namespace std;
int main()
{
char str1[100];
cin >> str1;
char str2[100];
cin >> str2;
int a[100] = { 0 }, b[100] = { 0 }, result[10000] = { 0 };
int len_a, len_b, len_r;
len_a = strlen(str1);
len_b = strlen(str2);
//将字符串逆序存储
for (int i = 0; i < len_a; i++)
{
a[len_a - i - 1] = a[i] - '0';
}
for (int i = 0; i < len_b; i++)
{
b[len_b - i - 1] = b[i] - '0';
}
//计算,将结果存于c中
for (int i = 0; i < len_b; i++)
{
for (int j = 0; j < len_a; j++)
{
result[i + j] += a[j] * a[i];
result[i + j + 1] += result[i + j] / 10; //处理进位
result[i + j] %= 10;
}
}
len_r = len_a + len_b;
//删除结果集中高位的前缀0
while (result[len_r - 1] == 0 && len_r > 1)
{
len_r--;
}
//将结果逆序输出
for (int i = len_r - 1; i >= 0; i--)
{
cout << result[i];
}
cout << endl;
return 0;
}

大整数加法
#include <iostream>
using namespace std;
#define MAXD 100
int main()
{
char str1[MAXD], str2[MAXD];
int a[MAXD], b[MAXD];
memset(str1, 0, sizeof(str1));
memset(str1, 0, sizeof(str2));
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));//将这些数组清零
cin >> str1;
cin >> str2;
int len1, len2, i, j;
len1 = strlen(str1);
len2 = strlen(str2);
j = 0;
int max = len1>len2 ? len1 : len2;
//将字符串反转并且转换为数字保存到数组里面
for (i = len1 - 1; i >= 0; i--)
{
a[j++] = str1[i] - '0';
}
j = 0;
for (i = len2 - 1; i >= 0; i--)
{
b[j++] = str2[i] - '0';
}
for (i = 0; i < max; i++)
{
b[i] += a[i]; //相加
if (b[i] >= 10)
{
b[i] -= 10;
b[i + 1] += 1; //产生进位
}
}
if (b[max] != 0)
{
cout << b[max];
}
for (i = max - 1; i >= 0; i--)
{
cout << b[i];
}
cout << endl;
return 0;
}

大整数减法
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[201] = { 0 }, b[201] = { 0 }, c[201] = { 0 };
int len_a, len_b, maxlen;
char str1[200];
char str2[200];
//输入两个大整数
cin >> str1;
cin >> str2;
//获取大整数的长度
len_a = strlen(str1);
len_b = strlen(str2);
//大整数逆序存储
for (int i = 0; i < len_a; i++)
{
a[i] = str1[len_a - i - 1] - '0';
}
for (int i = 0; i < len_b; i++)
{
b[i] = str2[len_b - i - 1] - '0';
}
//去除大整数的前导0
while (a[len_a - 1] == 0 && len_a > 1)
{
len_a;
}
while (b[len_b - 1] == 0 && len_b > 1)
{
len_b--;
}
maxlen = max(len_a, len_b);
//若a<b,输出一个负号,并交换a和b,始终确保a存放较大数
if (len_a < len_b)
{
cout << '-';
swap(a, b);
swap(len_a, len_b);
}
if (len_a == len_b)
{
for (int i = len_a - 1, j = len_b - 1; i >= 0; i--)
{
if (a[i] == b[i])
{
continue;
}
else if (a[i]>b[i])
{
break;
}
else
{
cout << '-';
swap(a, b);
swap(len_a, len_b);
break;
}
}
}
//计算a-b
for (int i = 0; i < maxlen; i++)
{
if (a[i]<b[i])
{
a[i] += 10; //借位
a[i + 1]--;
}
c[i] = a[i] - b[i];
}
//去除结果中的前导0
while (c[maxlen - 1] == 0 && maxlen>1)
{
maxlen--;
}
//输出结果
for (int i = maxlen - 1; i >= 0; i--)
{
cout << c[i];
}
cout << endl;
return 0;
}

大整数除法
#include <iostream>
#include <cstring>
using namespace std;
//去除前导0
int DelZero(int x[], int len_x)
{
int i = len_x;
while (x[i - 1] == 0 && i > 1)
{
i--;
}
return i;
}
//逆序输出数组值
void Show(int x[], int len_x)
{
for (int i = len_x - 1; i >= 0; i--)
{
cout << x[i];
}
cout << endl;
}
//若x>=y返回true,否则返回false
bool Compare(int x[], int y[], int len_x, int len_y)
{
if (len_x < len_y)
{
return false;
}
if (len_x == len_y)
{
for (int i = len_x - 1; i >= 0; i--)
{
if (x[i] > y[i])
{
return true;
}
if (x[i] < y[i])
{
return false;
}
}
return true;
}
return true;
}
//若x>=y,则x的高位减去y(只减一次),返回值为x的新长度
int sub(int x[], int y[], int z[], int len_x, int len_y)
{
int zLoc = len_x - len_y; //商的位置
//若不够减,则商的位置后移一位
for (int i = 1; i <= len_y; i++)
{
if (x[len_x - i] > y[len_y - i])
{
break;
}
if (x[len_x - i] < y[len_y - i])
{
zLoc--;
break;
}
}
if (zLoc < 0)
{
return len_x;
}
//当前被除数x的高位与除数y做一次减法运算
for (int i = zLoc, j = 0; i < len_x && j < len_y; i++, j++)
{
while (x[i] < y[j])
{
x[i + 1]--;
x[i] += 10;
}
x[i] -= y[j];
}
//商的相应位置加一
z[zLoc]++;
//计算当前被除数x的真实长度
while (x[len_x - 1] == 0)
{
len_x--;
}
if (len_x <= 0)
{
len_x = 1;
}
return len_x;
}
int main()
{
char str1[100], str2[100];
cin >> str1; //被除数
cin >> str2; //除数
int a[100] = { 0 }, b[100] = { 0 }, c[100] = { 0 };
int len_a = 0, len_b = 0, len_c = 1, maxlen = 0;
int i;
len_a = strlen(str1);
len_b = strlen(str2);
//被除数和除数分别逆序存放
for (i = 0; i < len_a; i++)
{
a[i] = str1[len_a - 1 - i] - '0';
}
for (i = 0; i < len_b; i++)
{
b[i] = str2[len_b - 1 - i] - '0';
}
//删除多余的0
len_a = DelZero(a, len_a);
len_b = DelZero(b, len_b);
//通过从高位开始连续减去除数,计算商和余数
len_c = len_a - len_b + 1;
while (Compare(a, b, len_a, len_b))
{
len_a = sub(a, b, c, len_a, len_b);
}
//解决商的位数是0或负数的情况
if (len_c < 1)
{
len_c = 1;
}
//去除商的前导0
len_c = DelZero(c, len_c);
//输出商c
cout << "商是:";
Show(c, len_c);
//输出余数a
cout << "余数是:";
Show(a, len_a);
return 0;
}


927

被折叠的 条评论
为什么被折叠?



