藍橋杯試題 算法提高 高精度乘法

藍橋杯試題 算法提高 高精度乘法

題目描述:

資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
  在C/C++語言中,整型所能表示的範圍一般爲-231到231(大約21億),即使long long型,一般也只能表示到-263到263。要想計算更加規模的數,就要用軟件來擴展了,比如用數組或字符串來模擬更多規模的數及共運算。
  現在輸入兩個整數,請輸出它們的乘積。
輸入格式
  兩行,每行一個正整數,每個整數不超過10000位
輸出格式
  一行,兩個整數的乘積。
樣例輸入
99
101
樣例輸出
9999
數據規模和約定
  每個整數不超過10000位
  
解題思路:

 每個整數不超過10000位,所以模擬乘法。按照模擬的思路計算即可。

如果手動模擬不來的話,看一下我的這個博客。類似的例子,有詳細的模擬過程圖的展示過程。

兩個數相乘的詳細模擬過程
 
 AC代碼:

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int a[10003],b[10003];
int ans[20005];
char aa[10003],bb[10003];
int main()
{
	int i,j;
	cin>>aa>>bb;
	int k1=0,k2=0;//k1爲數組a中元素的個數,k2爲數組b中元素的個數
	for(i=strlen(aa)-1;i>=0;i--)//逆向存儲字符串aa中的字符值 
		a[k1++]=(int)(aa[i]-'0');
	for(i=strlen(bb)-1;i>=0;i--)//逆向存儲字符串bb中的字符值 
		b[k2++]=(int)(bb[i]-'0');
	int k,sum,r;
	for(i=0;i<k2;i++)//乘以k2次aa字符串所對應的數值,即a數組中的所有數 
	{
		k=i;
		r=0;
		for(j=0;j<k1;j++)//每次循環需要乘的數值(也就是aa字符串轉換後的大數) 
		{
			sum=a[j]*b[i]+r;
			ans[k++]+=sum%10;
			r=sum/10;
		}
		if(r)//如果最後一個r不爲0,那麼數組ans的元素就多出來一位 
			ans[k++]+=r;
	}
	for(i=0;i<k;i++)//進位 
	{
		if(ans[i]>9)
		{
			ans[i+1]+=ans[i]/10;
			ans[i]=ans[i]%10;
		}
	}
	i=k-1;
	if(ans[k])//如果最後一位有進位的話,會多出來一位 
		i=k;
	for(;i>=0;i--)
		cout<<ans[i];
	cout<<endl;
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章