高精度运算(蒟蒻的学习脚印)

   计算机的计数方式和人不一样,众所周知,计算机的数据类型是有范围的。当处理上千乃至上万位数时,简单的数据类型不能胜任。下为各数据类型范围。

  回忆下小学数学竖式加法,我们要做的就是将一个数的各位数字用数组存起来,再让两个数组想做小学加法那样加起来,得到新的数组,再遍历输出,就能得到想要的超大数。

             1 7 3 

      +        8 1

                            

              2 5 4

下面是小学数学的模拟过程

#include<bits/stdc++.h>
using namespace std;
int arr[1000000]={0},brr[1000000]={0},crr[1000001]={0};
char a[1000000],b[1000000];
int main()
{
	cin>>a>>b;
	for(int i=strlen(a)-1;i>=0;--i)//数据导入,因为要把数位对齐,这里要倒序导入数据,把数字从右往左写 
	{
		arr[i]=a[strlen(a)-1-i]-'0';
	}
	for(int i=strlen(b)-1;i>=0;--i)
	{
		brr[i]=b[strlen(b)-1-i]-'0';
	}
	//开始小学加法
	for(int i=0;i<max(strlen(a),strlen(b))+1;++i)//从0位也就是个位开始,注意i的循环条件要多预留一位来处理进位 
	{
		crr[i]+=arr[i]+brr[i];//对齐的数位相加 
		crr[i+1]+=crr[i]/10;//进位 
		crr[i]%=10;
	}
	int m;//下面会用到的位数 
	for(int i=max(strlen(a),strlen(b))+2;i>=0;--i)//输出时候再倒一遍,注意高位的0是不能输出的
	{
		if(crr[i]!=0)
		{
			m=i;//得到最高位 
			break;
		}
	 } 
	 for(int i=m;i>=0;--i)//倒序输出 
	 {
	 	cout<<crr[i]; 
	 }
	return 0;
}

很简单吧,小学就干的事,不过代码还要自己打一打,才是你自己的东西。、

   乘法也一样,回忆下小学数学的竖式乘法

               1  1  1

      *            1  1

                                  

                1  1  1  

       +   1  1  1  

                                    

             1  2  2  1

    可以看出,如果把个位看成第0位,十位看成第1位,那么乘积结果的第i位就是做运算的两数的j和i-j位之积再求和,如上式的第1位(十位)是第一个数的第0位乘第二个数的第1位,再加第一个数的第1位乘第二个数的第0位.

      下面模拟竖式乘法

#include<bits/stdc++.h>
using namespace std;
int arr[1000000]={0},brr[1000000]={0},crr[2000005]={0};//乘法注意开两倍长度 
char a[1000000],b[1000000];
int main()
{
	cin>>a>>b;
	for(int i=strlen(a)-1;i>=0;--i)
	{
		arr[i]=a[strlen(a)-1-i]-'0';
	}
	for(int i=strlen(b)-1;i>=0;--i)
	{
		brr[i]=b[strlen(b)-1-i]-'0';
	}
	for(int i=0;i<=strlen(a)*strlen(b)+1;++i)
	{
		for(int j=0;j<=i;++j)
		{
			crr[i]+=arr[j]*brr[i-j];//核心运算 
		}
		crr[i+1]+=crr[i]/10;//进位 
		crr[i]%=10;
	}
	int m;//位数 
	for(int i=strlen(a)*strlen(b)+1;i>=0;--i)
	{
		if(crr[i]!=0)
		{
			m=i;
			break;
		}
	}
	for(int i=m;i>=0;--i)
	{
		cout<<crr[i];
	}
	return 0;
}

      完事收工       

          

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值