算法提高 P1001

算法提高 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;
} 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值