信息学奥赛一本通:1174:大整数乘法

【题目描述】

求两个不超过200位的非负整数的积。

【输入】

有两行,每行是一个不超过200位的非负整数,没有多余的前导0。

【输出】

一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】

12345678900
98765432100

【输出样例】

1219326311126352690000

【参考程序一】

#include<bits/stdc++.h>
using namespace std;

int  a_i[251],b_i[251],c_i[200001];
char a_c[251],b_c[251];
int lena,lenb,lenc=0;

int highPrecisionMulti(int a[],int b[])
{
	int lc=1,x;

	for(int i=1;i<=lena;i++)
	{
		 x=0;                                               //用于存放进位
         for (int j=1;j<=lenb;j++)                     //对乘数的每一位进行处理
         {
            c_i[i+j-1]=a[i]*b[j]+x+c_i[i+j-1]; //当前乘积+上次乘积进位+原数      
            x=c_i[i+j-1]/10;
           	c_i[i+j-1] %= 10;
         }
         c_i[i+lenb]=x;     
	}
	lc=lena+lenb;
	while(c_i[lc]==0&&lc>=1)//去除计算后的前导0 
	{
		lc--;
	 } 
	 
	return lc;
 } 

int main()
{
	cin>>a_c>>b_c;
	lena=strlen(a_c);
	lenb=strlen(b_c);
	//cout<<lena<<" "<<lenb;
	for(int i=0;i<=lena-1;i++)
	{
		a_i[lena-i]=a_c[i]-'0';//字符数组转整形数组 倒序存储 索引1-lena 
	}
	for(int i=0;i<=lenb-1;i++)
	{
		b_i[lenb-i]=b_c[i]-'0';//字符数组转整形数组 倒序存储 索引1-lenb 
	}
	//高精度乘法 
	lenc=highPrecisionMulti(a_i,b_i);

	if(lenc>1)
	{
		for(int i=lenc;i>=1;i--)
		{
			cout<<c_i[i];
		}
	}
	
	return 0;
 }

(1)数据的接收方法和存贮方法

         数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中。另一种方法是直接用循环加数组方法输入数据。

  void init(int a[])                            //传入一个数组

  {
            string s;

         cin>>s;                                  //读入字符串s

         len=s.length();                     //用len计算字符串s的位数

         for(i=1;i<=len;i++)

            a[i]=s[len-i] -‘0’;               //将数串s转换为数组a,并倒序存储

  }另一种方法是直接用循环加数组方法输入数据。

        (2) 高精度数位数的确定

               位数的确定:接收时往往是用字符串的,所以它的位数就等于字符串的长度。

        (3) 进位,借位处理

               加法进位:c[i]=a[i]+b[i];

                                 if (c[i]>=10) { c[i]%=10; ++c[i+1]; }

          减法借位:if (a[i]<b[i]) { --a[i+1]; a[i]+=10; }

                                 c[i]=a[i]-b[i];

          乘法进位:c[i+j-1]= a[i]*b[j] + x + c[i+j-1];

                                 x = c[i+j-1]/10;

                                 c[i+j-1] %= 10;

        (4) 商和余数的求法

             商和余数处理:视被除数和除数的位数情况进行处理.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芷水无棱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值