1.乘法
#include <bits/stdc++.h>
using namespace std;
char s1[2000], s2[2000];
int a[2000], b[2000], c[4000];
int main() {
cin >> s1 >> s2;
int ls1 = strlen(s1);
int ls2 = strlen(s2);
int ls3 = ls1 + ls2;
// 将字符串 s1 和 s2 转换为数组 a 和 b
for (int i = 0; i < ls1; i++) {
a[ls1 - i - 1] = s1[i] - '0';
}
for (int i = 0; i < ls2; i++) { // 注意这里是 ls2
b[ls2 - i - 1] = s2[i] - '0';
}
// 计算乘法
for (int i = 0; i < ls1; i++) {
for (int j = 0; j < ls2; j++) {
c[i + j] += a[i] * b[j];
c[i + j + 1] += c[i + j] / 10; // 处理进位
c[i + j] %= 10; // 取当前位的值
}
}
// 去掉前导零
while (ls3 > 0 && c[ls3 - 1] == 0) {
ls3--;
}
// 输出结果
for (int i = ls3 - 1; i >= 0; i--) {
cout << c[i];
}
return 0;
}
2.1.除法,大除以小
//高精度除法
#include <bits/stdc++.h>
using namespace std;
char s[2000];
long long b,a[2000],c[2000],x,la,lc;
int main()
{
cin >> s >> b;
la = strlen(s);
for(int i = 1;i<=la;i++)
{
a[i] = s[i-1] - '0';
}
for(int i = 1;i<=la;i++)
{
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
lc = 1;
while(c[lc]==0&&lc<=la)
{
lc++;
}
for(int i = lc;i<=la;++i){
cout << c[i];
}
return 0;
}
2.2除法,大除以大
#include <bits/stdc++.h>
using namespace std;
char s1[305], s2[305];
int a[305], b[305], c[305], tmp[305]; //c的长度最大为la-lb+1
void init(int* x) {
char s[305];
cin >> s;
x[0] = strlen(s);
for (int i = 0; i < x[0]; i++) {
x[i + 1] = s[x[0] - 1 - i] - '0'; // 正确逆序存储每一位
}
}
void print(int* x) {
if (x[0] == 0) {
cout << 0;
return;
}
for (int i = x[0]; i >= 1; i--) {
cout << x[i];
}
}
int compare(int a[], int b[]) {
if (a[0] != b[0]) {
return a[0] > b[0] ? 1 : -1;
}
for (int i = a[0]; i >= 1; i--) {
if (a[i] != b[i]) {
return a[i] > b[i] ? 1 : -1;
}
}
return 0;
}
void minu(int a[], int b[]) { // 修正函数名mine -> minu
for (int i = 1; i <= a[0]; i++) {
if (i <= b[0]) {
a[i] -= b[i];
}
if (a[i] < 0) {
a[i + 1]--;
a[i] += 10;
}
}
while (a[0] > 0 && a[a[0]] == 0) {
a[0]--;
}
}
void numcpy(int p[], int q[], int n) {
for (int i = p[0]; i >= 1; i--) {
q[i + n] = p[i];
}
q[0] = p[0] + n;
}
int main() {
init(a);
init(b);
if (compare(a, b) < 0) { // 处理a < b的情况
cout << 0;
return 0;
}
c[0] = a[0] - b[0] + 1;
for (int i = c[0]; i >= 1; i--) {
memset(tmp, 0, sizeof(tmp));
numcpy(b, tmp, i - 1); // 修正移动位数为i-1,因为商的最高位对应10^(la-lb)
while (compare(a, tmp) >= 0) {
c[i]++;
minu(a, tmp);
}
}
while (c[0] > 0 && c[c[0]] == 0) {
c[0]--;
}
print(c);
return 0;
}