萌新求助 高精度的模拟上面是哪里出了问题
查看原帖
萌新求助 高精度的模拟上面是哪里出了问题
447562
像素旋转楼主2021/1/19 11:08
#include<iostream>
#include<cstring>
#define min(a,b) (a<b?a:b)
void times(int a[],int b[],int c[],int,int);
int main(void)
{
	using namespace std;
	char str1[2002]{0};
	cin >> str1;
	int num1 = strlen(str1);
	int a[2001]{0};
	for (int i=0; i < num1; i++)
		a[i] = str1[num1 - i - 1] - '0';
	char str2[2002]{0};
	cin >> str2;
	int num2 = strlen(str2);
	int b[2001]{0};
	for (int i = 0; i < num2; i++)
		b[i] = str2[num2 - i - 1] - '0';
	//得到了两个便于进位的反向数组
	int c[4001]{0};
	times(a,b,c,num1,num2);
	int len = 4000;
	while (c[len] == 0)len--;
	len++;
	for (int i=0; i < len; i++)
		cout << c[len-i-1];
	return 0;
}
void times(int a[],int b[],int c[],int num1,int num2)
{
	int *p=a,*q=b,*k=c,i=0;
	//想办法让*顺序为位数多的在上位数低的做循环
	//下面第一个循环控制整体循环min次,k持续进一位保证模拟乘法
	for (; k < c + min(num1, num2); k++) {
		int d[2001]{0};
		int* l = k,i2=0/*i2用于记录d中存放的长度*/;
		if (min(num1, num2) == num1) {
			//for(;p<a+num1;p++)
			for (p=a,q=b; q < b + num2; q++) {
				d[i] += (*p) * (*q);
				if (d[i] > 9) {
					d[i + 1] += 1;
					d[i] -= 10;
				}
				i++;
			}
			d[i]>0?(i2 = i):(i2= i - 1);
			i = 0;
			p++;
		}
		else {
			//for(;q<b+num2;q++)
			for (p=a,q=b; p < a + num1; p++) {
				d[i] += (*p) * (*q);
				if (d[i] > 9) {
					d[i + 1] += 1;
					d[i] -= 10;
				}
				i++;
			}
			d[i] > 0 ? (i2 = i) : (i2 = i - 1);
			i = 0;
			q++;
		}
		//i2保存了d[]的位数
		//以上语句使得d[]中每次存的都是我们需要的将加换乘的数
		for (int i=0; l < k + i2; l++,i++) {
			*l+=d[i];
			if (*l > 9) {
				*(l + 1) += 1;
				*l -= 10;
			}
	 }
	}
	return;
}

我希望的是模拟多位数之间的竖式乘法过程

2021/1/19 11:08
加载中...