藍橋杯試題 算法提高 P1001

藍橋杯試題 算法提高 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章