【例1.3】高精度乘法

       输入两个正整数,求它们的差
【算法分析】
       类似加法,可以用竖式求乘法。在做乘法运算时,同样也有进位,同时对每一位进行乘法运算时,必须进行错位相加,如下图所示:
在这里插入图片描述       分析C数组下标的变化规律,可以写出如下关系式:ci = c’i +c”i +…由此可见,ci与a[i]*b[i]乘积有关,跟上次的进位有关,还跟原ci的值有关,分析下标规律,有c[i+j-1]= a[i]*b[j]+ x + c[i+j-1]; x=c[i+j-1]/10 ; c[i+j-1]%=10;。
【参考程序】

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

int main() {
	char a1[101], b1[101];
	int a[101], b[101], c[10001], lena, lenb, lenc, x;
	
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));
	scanf("%s", a1);				// 一本通网站提交代码,使用gets(a1),运行“未通过”! 
	scanf("%s", b1);
	
	lena = strlen(a1);
	lenb = strlen(b1);
	for (int i=0; i<lena; i++) {
		a[lena-i] = a1[i] - 48;
	}
	for (int i=0; i<lenb; i++) {
		b[lenb-i] = b1[i] - 48;
	}
	
	for (int i=1; i<=lena; i++) {					// 对被乘数的每一位进行处理 
		x = 0;										// 用于存放进位 
		for (int j=1; j<=lenb; j++) {				// 对乘数的每一位进行处理 
			c[i+j-1] = a[i]*b[j] + x + c[i+j-1]; 	// 当前乘积+上次乘积进位——原数
			x = c[i+j-1] / 10;
			c[i+j-1] %= 10; 
		}
		c[i+lenb] = x;								// 进位 
	}
	
	lenc = lena + lenb;
	while (c[lenc]==0 && lenc>1) {					// 删除前导0 
		lenc--; 
	} 
	
	for (int i=lenc; i>=1; i--) {
		cout << c[i];
	}
	
	return 0;
}

发布了49 篇原创文章 · 获赞 0 · 访问量 1035

猜你喜欢

转载自blog.csdn.net/developer_zhb/article/details/105004011
今日推荐