信息学奥赛一本通 1307:【例1.3】高精度乘法 1174:大整数乘法 (耙耙)

1307:【例1.3】高精度乘法


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 20666     通过数: 7103

【题目描述】

输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。

【输入】

输入两个高精度正整数M和N。

【输出】

求这两个高精度数的积。

【输入样例】

36
3

【输出样例】

108

【来源】


No

解释:关键是找规律,找到新数组的存放位置与两个相乘数的位置关系

注意:进位

#include<bits/stdc++.h>
using namespace std;
int a[205],b[205],c[500],la,lb,lc=1;
string sa,sb;
void pa(){
	for(int i=1;i<=la;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
}
void pb(){
	for(int i=1;i<=lb;i++){
		cout<<b[i]<<" ";
	}
	cout<<endl;
}
void pc(){
	for(int i=1;i<=lc;i++){
		cout<<c[i]<<" ";
	}
	cout<<endl;
}
int main(){
	freopen("cpp.in","r",stdin);
	freopen("cpp.out","w",stdout);
	cin>>sa;
	cin>>sb;
	la = sa.size();
	lb = sb.size();
	// 倒序从1开始排 
	for(int i=la-1;i>=0;i--){
  		a[la-i] = sa[i]-'0';  
	}
//	pa();
	for(int i=lb-1;i>=0;i--){
		b[lb-i] = sb[i]-'0';
	}
//	pb();
	// 找规律,发现i*j位,是放到新数组的 i*j-1
	// 注意:放完后,要进位,用 / 和 % 符合,将下一位 加 
	for(int i=1;i<=la;i++){
		for(int j=1;j<=lb;j++){
			lc = i+j-1;
			c[lc] += a[i]*b[j];
			c[lc+1] += c[lc]/10;
			c[lc] = c[lc]%10;
		}
	}
	//设置c的位数(应该是la+lb,不过好似感觉要多一位比较靠谱,反正都有消位)
	// 如果没有设置,lc延续之前的 lc=i+j-1; 比真正结果少一位 
	lc = la+lb+1;
//	pc();
	while(c[lc]==0){
		lc--;
	}
	for(int i=lc;i>=1;i--){
		cout<<c[i];
	}
	return 0;
}
发布了33 篇原创文章 · 获赞 0 · 访问量 167

猜你喜欢

转载自blog.csdn.net/weixin_42790071/article/details/105504088