高精度的加法,减法,乘法,除法

高精度的加法,减法,乘法,除法

1.char版

高精度的加法:

#include<bits/stdc++.h>//万能头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10010],b[10010],c[10010];//将char型的变成int,存在a,b两个数组里面,c里面用来存储和
char a1[10010],b1[10010];//用于存储输入的两个数组
int i,j;
int main()
{
	scanf("%s%s",a1,b1);
	int la=strlen(a1),lb=strlen(b1);//获取两个数组的长度
	for(int i=0; i<la; i++)
	{
		a[la-i-1]=a1[i]-48;//倒序存储,便于加减和进借位的处理,48是0
        //的ASC||码,将char型变成int型
    }
	for(int i=0; i<lb; i++)
	{
		b[lb-i-1]=b1[i]-48;//同上面的处理
	}
	int m=la>lb?la:lb;//选择长度较大,作为循环的条件
	for(i=0; i<m; i++)
	{
		c[i]+=a[i]+b[i];//C[i]里面可能存储了下一位进位上来的数字,所以是+=,先将右边的a[i]+b[i]
                        //求出来之后在将相应的进位位加起来。
		if(c[i]>=10)
		{
			c[i+1]++;
			c[i]-=10;
		}
	}
	while(c[m]==0&&m>=1)//去除前置0
		m--;
	for(i=m; i>=0; i--)
		printf("%d",c[i]);//逆序输出
	return 0;
}

高精度的减法

#include<bits/stdc++.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10010],b[10010],c[10010];
char a1[10010],b1[10010];
int i,j;
int main()
{
	scanf("%s%s",a1,b1);
	int la=strlen(a1),lb=strlen(b1);
	for(int i=0; i<la; i++)
	{
		a[la-i-1]=a1[i]-48;
	}
	for(int i=0; i<lb; i++)
	{
		b[lb-i-1]=b1[i]-48;
	}
	int m=la>lb?la:lb;
	for(i=0; i<m; i++)
	{
		c[i]+=a[i]-b[i];//现在c[i]里面有从高位借的数字,也要加上现在c[i]里面的数字
		if(c[i]<0)
		{
			c[i+1]--;
			c[i]+=10;
		}
	}
	if(c[i]==-1)//如果最后一位是负数,说明现在的a比b小,可以在一开始就判断,或者像下面处理
	{
		memset(c,0,sizeof(c));
		for(i=0; i<m; i++)
		{
			c[i]+=b[i]-a[i];
			if(c[i]<0)
			{
				c[i+1]--;
				c[i]+=10;
			}
		}
		printf("-");//因为结果位负,所以现在要先打印负号。
	}
	while(c[m]==0&&m>=1)
		m--;
	for(i=m; i>=0; i--)
		printf("%d",c[i]);//同样道理,判断前置0
	return 0;
}

高精度的乘法

#include<bits/stdc++.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10010],b[10010],c[10010];
char a1[10010],b1[10010];
int i,j;
int main()
{
	scanf("%s%s",a1,b1);
	int la=strlen(a1),lb=strlen(b1);
	for(int i=0; i<la; i++)
	{
		a[la-i-1]=a1[i]-48;
	}
	for(int i=0; i<lb; i++)
	{
		b[lb-i-1]=b1[i]-48;
	}
	int l=la+lb-1;//这里的l用来存储的是两个数相乘的最多的位数
	for(i=0; i<la; i++)
	{
		for(j=0; j<lb; j++)
		{
			c[i+j]+=a[i]*b[j];//i表示的i+1位,j表示j+1位,所以这里,位数位i+j+2-1=i+j-1
            //又因为c数组也是从0开始表示的,所以数组下标位i+j+1-1=i+j;
           //同理,c[i+j]里面也可能存储着进位,所以需要加上。
		}
	}
	for(i=0; i<l; i++)
	{
		if(c[i]>9)
		{
			c[i+1]+=c[i]/10;//10进制,满10进1
			c[i]%=10;//如果由进位,那么该位就是存储mod10的余数。
		}
	}
	while(c[l]==0&&l>=1)
		l--;
	for(i=l; i>=0; i--)//同理,去除前导0
		printf("%d",c[i]);
	return 0;
}

2.vector版本

vector<int> mul(vector<int>a, int b)
{
	vector<int>c;
	int t = 0;
	for (int i = a.size() - 1; i >= 0; i--)
	{
		t += a[i] * b;
		c.insert(c.begin(), t % 10);
		t = t / 10;
	}
	if (t > 0)
		c.insert(c.begin(), t);
	return c;
}

vector<int> div(vector<int>a, int b)
{
	vector<int>c;
	bool is_first = true;
	int t = 0;
	int x = 0;
	for (int i = 0; i < a.size(); i++)
	{
		t = t * 10 + a[i];
		x = t / b;
		if (!is_first || x)
		{
			c.push_back(x);
			is_first = false;
		}
		t = t % b;
	}
	return c;
}

vector<int>Plus(vector<int>a, int b)
{
	vector<int>c;
	int t = b;
	if (t == 0) return a;
	int i = a.size() - 1;
	for (i; i >= 0; i--)
	{
		t = t + a[i];
		c.insert(c.begin(), t % 10);
		t = t / 10;
		if (t == 0)
			break;
	}
	if (i != -1)
		c.insert(c.begin(), a.begin(), a.begin() + i);
	else
	{
		while (t)
		{
			c.insert(c.begin(), t % 10);
			t = t / 10;
		}
	}
	return c;
}

vector<int>reduce(vector<int>a, int b)
{
	vector<int>c;
	int t = 0;
	if (b == 0)
		return a;
	bool is_true = true;
	int i;
	int p = 0;
	for (i = a.size() - 1; i >= 0; i--)
	{
		if (is_true == false)break;
		t = t + a[i] * pow(10, p);
		p++;
		if (t > b)
		{
			c.push_back(t - b);
			is_true = false;
		}
	}
	if (i != -1)
		c.insert(c.begin(), a.begin(), a.begin() + i + 1);
	return c;
}
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值