大整数运算

大整数运算详解与代码实现
这篇博客详细探讨了大整数的运算,包括加法、减法、乘法和两种不同情况下的除法。每种运算都有相应的代码实现,涵盖了大整数运算的核心逻辑。

大整数加法

代码实现:

#include<cstring>
#include<cstdio>
int main()
{
	char a1[205],b1[205];
	gets(a1);
	gets(b1);
	int lena=strlen(a1);
	int lenb=strlen(b1);
	int a[205],b[205];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	for(int i=0;i<=lena-1;i++)
		a[lena-i]=a1[i]-'0';
	for(int i=0;i<=lenb-1;i++)
		b[lenb-i]=b1[i]-'0';
	int c[205];
	memset(c,0,sizeof(c));
	int lenc=1;
	int x=0;
	while(lenc<=lena||lenc<=lenb)
	{
		c[lenc]=a[lenc]+b[lenc]+x;
		x=c[lenc]/10;
		c[lenc]%=10;
		lenc++;
	}
	c[lenc]=x;
	while(c[lenc]==0&&lenc>1)
		lenc--;
	for(int i=lenc;i>=1;i--)
		printf("%d",c[i]);
	return 0;
}

大整数减法

代码实现:

#include<cstring>
#include<cstdio>
int main()
{
	char n[205],n1[205],n2[205];
	gets(n1);
	gets(n2);
	int lena=strlen(n1);
	int lenb=strlen(n2);
	int a[205]={},b[205]={},c[205]={};
	if(lena<lenb||(lena==lenb&&strcmp(n1,n2)<0))
	{
		strcpy(n,n1);
		strcpy(n1,n2);
		strcpy(n2,n);
		printf("-");
	}
	lena=strlen(n1);
	lenb=strlen(n2);
	for(int i=0;i<=lena-1;i++)
		a[lena-i]=n1[i]-48;
	for(int i=0;i<=lenb-1;i++)
		b[lenb-i]=n2[i]-48;
	int x=1;
	while(x<=lena)
	{
		if(a[x]<b[x])
		{
			a[x]+=10;
			a[x+1]--;
		}
		c[x]=a[x]-b[x];
		x++;
	}
	int lenc=x;
	while(c[lenc]==0&&lenc>1)
		lenc--;
	for(int i=lenc;i>=1;i--)
		printf("%d",c[i]);
	return 0;
}

大整数乘法

代码实现:

#include<cstdio>
#include<cstring>
int main()
{
	char a1[200],b1[200];
	gets(a1);
	gets(b1);
	int lena=strlen(a1);
	int lenb=strlen(b1);
	int a[200]={},b[200]={},c[400]={};
	for(int i=0;i<lena;i++)
		a[lena-i]=a1[i]-48;
	for(int i=0;i<lenb;i++)
		b[lenb-i]=b1[i]-48;
	int x=0;
	int lenc=0;
	for(int i=1;i<=lena;i++)
	{
		x=0;
		for(int j=1;j<=lenb;j++)
		{
			c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
			x=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
		c[i+lenb]=x;
	}
	lenc=lena+lenb;
	while(c[lenc]==0&&lenc>1)
		lenc--;
	for(int i=lenc;i>=1;i--)
		printf("%d",c[i]);
}

大整数除法(高精除以低精)

代码实现:

#include<cstring>
#include<cstdio>
int main()
{
	char a1[100];
	int a[100]={},c[100]={};
	int b,x=0,lenc;
	gets(a1);
	scanf("%d",&b);
	int lena=strlen(a1);
	for(int i=0;i<=lena-1;i++)
		a[i+1]=a1[i]-48;
	for(int i=1;i<=lena;i++)
	{
		c[i]=(x*10+a[i])/b;
		x=(x*10+a[i])%b;
	}
	lenc=1;
	while(c[lenc]==0&&lenc<lena)
		lenc++;
	for(int i=lenc;i<=lena;i++)
		printf("%d",c[i]);
	return 0;
}

大整数除法(高精除以高精)

代码实现:

#include<cstdio>  
#include<iostream>  
#include<cstring>  
using namespace std;  
void bigchu(char *a,char *b,char *c,int& lc)  
{  
    int la=strlen(a),lb=strlen(b),f1;  
    int i=0;  
    lc=0;  
    while(i<=la-lb)  
    {  
        f1=0;  
        c[lc]='0';  
        while(1)  
        {  
            if(i==0||a[i-1]=='0') 
                for(int j=i; j<i+lb; j++)  
                {  
                    if(a[j]>b[j-i]) break;  
                    if(a[j]<b[j-i])  
                    {  
                        f1=1;  
                        break;  
                    }  
                }  
            if(f1) break;  
            for(int j=lb-1; j>=0; j--)  
                if(a[i+j]>=b[j])  
                    a[i+j]-=b[j]-'0';  
                else a[i+j]+=10-b[j]+'0',a[i+j-1]--;  
            c[lc]++;  
        }  
        if(c[lc]!='0'||i!=0) lc++;  
        i++;  
    }  
}  
int main()  
{  
    char a[1000],b[1000],c[1000];  
    int lc;  
    cin>>a>>b;  
    bigchu(a,b,c,lc);  
    if(lc!=0)  
        for(int i=0; i<lc; i++)  
            cout<<c[i];  
    else cout<<0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值