蓝桥杯试题 算法提高 P1001

蓝桥杯试题 算法提高 P1001

题目描述:

资源限制
时间限制:1.0s 内存限制:256.0MB
  
  当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.

输入:
  62773417 12345678

输出:
  774980393241726
  
  解题思路:
  
模拟两个数字相乘的方法,和我们平时计算两个数字相乘是一个思路,细心一点,其实不难。注意,最后再进行进位。

具体可以看下图的模拟:

蓝桥杯试题 算法提高 P1001_第1张图片

AC代码:

#include 
#include 
#include 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(蓝桥)