您的位置:首页 > 其它

算法提高 P1001

2017-02-21 19:18 204 查看
算法提高 P1001  

时间限制:1.0s   内存限制:256.0MB
    

  

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

输入:

  62773417 12345678

输出:

  774980393241726

问题分析:其实就是模拟乘法的过程,但是因为数太大,所以这里用字符型数组来表示,但是这里有个主意点就是循环中,a[i]与b[j]相乘的结果应该储存在ans[i+j+1]而不是ans[i+j],因为这里ans[0]是留给最高位进位的情况,如果相乘结果直接存在ans[i+j]中,若吗最高位进位了,那么就会产生错误,若有ans[0]留一位,就可以存储。同时这里由于模拟的原因,所以比如:乘数分别为0,1234,那么结果就是0000,显然显示一个零就可以,这里有两种判断方法,一个很基础判断其中一个为0而另一个不为0即可,另一个判断方法就是判断ans[1]不为0,因为m位数和n为数都不为0相乘最少也是m+n-1位数,而ans[1]就是第m+n-1位数,所以如果ans[1]==0,那么肯定整个数为0,这时输出0即可

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int main()
{
char a[8],b[8];
char ans[16];
int len1,len2;

scanf("%s%s",a,b);
len1 = strlen(a);
len2 = strlen(b);
memset(ans,0,sizeof(ans));
for(int i=len1-1; i>=0; i--)
for(int j=len2-1; j>=0; j--)
{
ans[i+j+1] += (a[i]-48)*(b[j]-48);
if (ans[i+j+1]>9)
{
ans[i+j] += ans[i+j+1]/10;
ans[i+j+1] %= 10;
}
}
if ((len1==1 && a[0]=='0') || (len2==1 && b[0]=='0'))
printf("0");
/*
if(0 == mulNum[1] )    //说明整体为0
cout<<"0"<<endl;
*/
else
{
if (ans[0]!=0)
printf("%d",ans[0]);
for(int i=1; i<len1+len2; i++)
printf("%d",ans[i]);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: