进阶#高精度乘除法

 

上次Seele酱讲过了高精度的加减法,这次我又带来了高精度的乘除法,请慢用~

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
char n1[9999],n2[9999];
int z[99][99]={0};
int s1[9999],s2[9999],s3[9999]={0},f;
int main()
{
	int i,l,nx,ny,jw=0,w,n;
	cin>>n1>>n2;
	nx=strlen(n1);//读入字符串长度
	ny=strlen(n2);
	int y=max(nx,ny);//计算数位最大值 
	
	for(i=0;i<nx;i++)
	{
		s1[i]=n1[nx-1-i]-'0';//输入一个数 
	}
	for(i=0;i<ny;i++)
	{
		s2[i]=n2[ny-1-i]-'0';//另一个数 
	}
	for(n=0;n<=nx;n++)
	{

		for(w=0;w<=ny;w++)
		{
			s3[w+n]+=s1[n]*s2[w];//做乘法
			if(s3[w+n]>=10)//判断进位情况 
			{
			s3[w+n+1]+=s3[w+n]/10;//加上进位得数
			s3[w+n]=s3[w+n]%10; //减去进位所需的数
			}			
			
		    
		}

	}	
    f=nx+ny;
	while(s3[f]==0&&f>0) f--;//把0统统消掉~ 
	for(i=f;i>=0;i--) cout<<s3[i];
}

除法的实现比较难一点.

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[10001];
long long b,l;
long long  c[10001],ans[10001];
int main() {
	gets(a);//接收char,之后转成int 
	l=strlen(a);//记录长度 
	cin>>b;
	int n=0;
	for (int i=1; i<=l; i++) {
		if (isdigit(a[l-i])) {//判定是否是个数字 
			n++;
			c[n]=a[l-i]-'0';//倒序存储并转为int 
		}
	}
	while (c[n]<b&&l>=1) {//不够除借位
		c[n-1]=c[n-1]+c[n]*10;
		c[n]=0;
		n--;
	}
	for (int i=n;i>=1;i--) {
		if (c[i]>=b) {
			ans[i]=c[i]/b;//开始除法 
			c[i]=c[i]%b;
		}
		c[i-1]=c[i-1]+c[i]*10;//把除不尽的加到下一位 
	}
	for (int i=n;i>=1;i--) cout<<ans[i];//输出 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值