Informatics Orsay Book 1307:[Example 1.3] High-precision multiplication 1174:Large integer multiplication(rake)

1307:[例1.3]高精度の乗算


時間制限:1000 msメモリ制限:65536 KB
コミット:20666パス:7103

【タイトル説明】

2つの高精度の正の整数MとNを入力します(MとNはどちらも100桁未満です)。これら2つの高精度数値の積を求めます。

【入力】

2つの高精度の正の整数MとNを入力します。

【出力】

これら2つの高精度数値の積を求めます。

【入力例】

36
3

【出力例】

108

【出典】


番号

説明:キーは、法則を見つけ、新しい配列の格納位置と2つの乗算器の位置の関係を見つけることです

注:キャリー

#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