[蓝桥杯][算法提高]-高精度算法

题目

在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263。要想计算更加规模的数,就要用软件来扩展了,比如用数组或字符串来模拟更多规模的数及共运算。
  现在输入两个整数,请输出它们的乘积。
输入格式
  两行,每行一个正整数,每个整数不超过10000位
输出格式
  一行,两个整数的乘积。

注意一点

在做乘法运算时,同样也有进位,同时对每一位进行乘法运算时,必须进行错位相加

直接上代码

#include <iostream>
#include <cstring>
using namespace std;
#define M 10000
#define N 20000//注意数组c存的值是a*b,位数要设为a,b的位数的两倍
int main(int argc, char *argv[]) {
	string str1,str2;
	cin>>str1>>str2;
	int i,j,k=0,q=0,r=0,len=0,len1,len2;
	len1=str1.length();
	len2=str2.length();
	int a[M],b[M],c[N];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));

	for(i=0;i<len1;i++)
		a[len1-1-i]=str1[i]-'0';		/*a[len-1]~a[0]*/
	for(j=0;j<len2;j++)
		b[len2-1-j]=str2[j]-'0';
		
	for(i=0;i<len2;i++){
		r=0;/*每开始一轮相乘,进位r重新赋值为0*/
		for(j=0;j<len1;j++){
			c[k]=b[i]*a[j]+c[k]+r;/*两个数相乘比较特殊,b的个位 乘 a的个位到最高位的结果放入c[0]~c[k];之后b的十位再乘一遍a,得到的结果放入c[1]~c[k]*/
			r=c[k]/10;
			c[k]=c[k]%10;
			k++;
		}
		len=k;/*i=0,此为b的个位乘一遍a后得到结果c的位数,从c[0]开始记;i=1,此为b的十位乘a后得到结果c的位数,结果存入c[1]至c[k]*/
		c[len]=r;/*i=0,b的个位乘a后得到结果c的最高位*/
		if(r==0)/*若r=0,即无进位,则给有进位时预留的最高位,减1*/
			len--;
		k=++q;/*k用于错位相加时指定数组c的下标;若用k=q++;则下一轮的k为0,而不是1; */
	}	
	for(i=len;i>=0;i--)
		cout<<c[i];
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值