藍橋杯試題 算法提高 高精度乘法
題目描述:
資源限制
時間限制: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;
}