藍橋杯試題 算法提高 P1001
題目描述:
資源限制
時間限制:1.0s 內存限制:256.0MB
當兩個比較大的整數相乘時,可能會出現數據溢出的情形。爲避免溢出,可以採用字符串的方法來實現兩個大數之間的乘法。具體來說,首先以字符串的形式輸入兩個整數,每個整數的長度不會超過8位,然後把它們相乘的結果存儲在另一個字符串當中(長度不會超過16位),最後把這個字符串打印出來。例如,假設用戶輸入爲:62773417和12345678,則輸出結果爲:774980393241726.
輸入:
62773417 12345678
輸出:
774980393241726
解題思路:
模擬兩個數字相乘的方法,和我們平時計算兩個數字相乘是一個思路,細心一點,其實不難。注意,最後再進行進位。
具體可以看下圖的模擬:
AC代碼:
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int arr1[10],arr2[10],ans[20];
int main()
{
int a,b;
cin>>a>>b;//將b分解爲一位一位的存儲在數組arr中
if(a==0||b==0)//注意這一步
{
cout<<"0"<<endl;
return 0;
}
if(a<b)
swap(a,b);//b當做模擬乘法的時候下面的數
int k1=0,k2=0;
while(a)//將a逆序存儲在數組arr1中
{
arr1[k1++]=a%10;
a/=10;
}
while(b)//將b逆序存儲在數組arr2中
{
arr2[k2++]=b%10;
b/=10;
}
int cnt,i;
int kk,r,sum;
//這個時候,無疑k1>k2
for(cnt=0;cnt<k2;cnt++)//乘幾次,即b是幾位數
{
kk=cnt;//計算ans數組中的每次相乘的起始索引位置
r=0;
for(i=0;i<k1;i++)
{
sum=arr1[i]*arr2[cnt]+r;
ans[kk++]+=sum%10;
r=sum/10;
}
if(r)//多出來的進位
ans[kk++]+=r;
}
//某個索引位置的數值如果是兩位數,那麼應該向後一個索引位置進位(這裏指i+1的位置)
for(i=0;i<kk;i++)
{
if(ans[i]>9)//需要進位
{
ans[i+1]+=ans[i]/10;
ans[i]=ans[i]%10;
//printf("ans[%d]==%d ans[%d]==%d\n",i,ans[i],i+1,ans[i+1]);
}
}
i=kk-1;
if(ans[kk])//如果有進位的話
i=kk;
for(;i>=0;i--)//逆向輸出最後的答案
cout<<ans[i];
cout<<endl;
return 0;
}