c语言实现高精度运算大数运算(加减乘除)

1、加法运算

1、首先将两个很大的数放入字符数组a,b中,然后将大数的每个数倒着放入s1和s2中,例如a中是1234,则s1[1]=4,s1[2]=3,s1[3]=2,s1[4]=1。然后判断哪个数更大,然后加完得到的值放在s3中;加的方法为:先从低位开始加,如果值大于10,则后一位为这一位除以10;则这一位的值为自己对10取余;依次循环。然后判断s3值的最后一位是否为0,并且长度要大于0,要是为0的话就忘前挪一位来去掉前面的0;例如:1234+9111,1+9要往前进一位,len3不用减;1234+22,结果为1256,但在s3中为65210,要去掉0。最后反向输出答案即可。

#include<stdio.h>
#include<string.h>

int main(){
    char a[1000],b[1000];
    int s1[1000],s2[1000],s3[1000];
    scanf("%s",a);
    scanf("%s",b);
    int len1,len2,len3;
    int i,j;

    len1=strlen(a);
    for(i=0;i<len1;i++)
        s1[len1-i]=a[i]-'0';
    len2=strlen(b);
        s2[len2-j]=b[j]-'0';
    
    int max=len1;
    if(max<len2) max=len2;
    len3=max+1;
    for(i=1;i<len3;i++){
        s3[i]+=s1[i]+s2[i];
        s3[i+1]=s3[i]/10;
        s3[i]=s3[i]%10;
    }
    while(s3[len3]==0&&len3>0) len3--;
    for(j=len3;j>0;j--) printf("%d",s3[j]);
    return 0;
}

2、减法运算

#include<stdio.h>
#include<string.h>
#include<stdbool.h> 
	char s1[1000],s2[1000],s3[1000];
	int a[1000]={0},b[1000]={0},c[1000]={0};
	int flag=0;
	int i,j;
	bool exange(char s1[],char s2[],int len1,int len2)//判断s1和s2的大小 
	{	if(len1!=len2) return len1>len2;//len1大于len2输出true,反之输出false 
		int i;
		for(i=0;i<len1;i++){
			if(s1[i]!=s2[i])
				return s1[i]>s2[i];
		}
		return true;//len1=len2,输出true 
	}	
int main(){
    int len1,len2,len3;
	scanf("%s %s",s1,s2);
	len1=strlen(s1),len2=strlen(s2);

	if(!exange(s1,s2,len1,len2)){//s1小于s2执行 
		flag=1;//标志位
		strcpy(s3,s1);
		strcpy(s1,s2);
		strcpy(s2,s3); 
	}
	for(i=0;i<len1;i++)
		a[len1-i]=s1[i]-'0';
	for(j=0;j<len2;j++)
		b[len2-j]=s2[j]-'0';
		
	len3=len1;
	if(len3<len2) len3=len2;
	for(i=1;i<=len3;i++){
		if(a[i]<b[i])
		{
			a[i+1]--;
			a[i]+=10;
		} 
		c[i]=a[i]-b[i];
	}
	while(c[len3]==0&&len3>0) len3--;
	if(flag==1) printf("-"); 
	int k;
	for(k=len3;k>0;k--)
		printf("%d",c[k]);
	return 0;
} 

1、减法的主要思想是:先判断能否减过,例如342-77,2-7向前借一,12-7=5,所以c【i+1】先减1,然后c【i】自加10,在进行减法。

2、还要考虑负数的情况;用布尔函数进行判断,如果两个数位数不同,s1大于s2则返回true,反之返回false,若位数相同,则一位一位判断,同理s1大于s2则返回true,反之返回false,若相同最后返回true。

3、调用布尔函数判断时取非,即s1小于s2是执行下面的指令:用strcpy函数交换。

4、然后将字符数组转置成整形数组,最后进行相减。

5、最后一步一样,删除前面的0。结束!

3、乘法运算

1、主要思想:(b站麦克老师)

#include<stdio.h>
#include<string.h>

int main(){
	char s1[1000],s2[1000];
	int a[1000],b[1000],c[1000];
	scanf("%s %s",s1,s2);
	int len1,len2,len3;
	len1=strlen(s1),len2=strlen(s2);
	int i,j;
	len3=len1+len2;
	for(i=0;i<len1;i++) a[len1-i]=s1[i]-'0';//转置数组 
	for(j=0;j<len2;j++) b[len2-j]=s2[j]-'0';
	for(i=1;i<=len1;i++){
		for(j=1;j<=len2;j++){
			c[i+j-1]+=a[i]*b[j];
			c[i+j]+=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	}
	if(c[len3]==0&&len3>0) len3--;
	for(i=len3;i>0;i--) printf("%d",c[i]);
	return 0;
}

4、除法运算

1、高精度除低精度

方法:逐位试商法

#include<stdio.h>
#include<string.h>

int main(){
	char s1[1000];
	long a[1000],b,x,c[1000];
	scanf("%s",s1);
	scanf("%d",&b);
	int len1,len4;
	len1=strlen(s1);
	int i;
	for(i=1;i<=len1;i++) a[i]=s1[i-1]-'0';
	for(i=1;i<=len1;++i){
		c[i]=(x*10+a[i])/b;
		x=(x*10+a[i])%b;
	}
	len4=1;
	while(c[len4]==0&&len4<len1) len4++;
	for(i=len4;i<=len1;i++) printf("%d",c[i]);
	return 0;
}

主要思想:4312除以12,用每一项去除12,4除12=0,然后4*10+3除12,余7,然后7*10+1=71再去除12,依次类推即可。 

注意:这里转置数组时不需要倒置。

2、高精度除高精度

方法:减法类比法

#include<stdio.h>
#include<string.h>
#include<stdbool.h>

void add_0(char b[],int tmp,int len2){
	int j;
	for(j=0;j<tmp;j++){
		b[len2+j]=0;
	}
}
bool vs(char b[],char a[]){
	int bl=strlen(b);
	int al=strlen(a);
	if(al!=bl) return al>bl;
	int i;
	for(i=0;i<al;i++){
		if(a[i]!=b[i]) return a[i]>b[i];
	}
	return true;
}
//高精度减法
void subt(char s1[],char s2[]){
	int u=strlen(s1),v=strlen(s2);
	int a[1000],b[1000],c[1000];
	int i,max;
	for(i=0;i<u;i++) a[u-i]=s1[i]-'0';
	for(i=0;i<v;i++) b[v-i]=s2[i]-'0';
	max=u;
	if(max<v) max=v;
	for(i=1;i<=max;i++){
		if(a[i]<b[i]){
			a[i+1]--;
			a[i]+=10;
		}
		c[i]=a[i]-b[i];
		s1[i]=c[i];
	}	
	while(s1[max]==0&&max>0) max--;
	
} 

int main(){
	char s1[1000],s2[1000];
	int len1,len2,len3,c[1000];
	scanf("%s %s",s1,s2);
	len1=strlen(s1),len2=strlen(s2);
	int i,j,tmp;
	len3=len1-len2+1;
	for(i=len3;i>=1;i--){
		tmp=--i;
		add_0(s2,tmp,len2);
		while(vs(s2,s1)){
			c[i]++;
			//高精度减法
			subt(s1,s2); 
		}
	}
	for(i=1;i<=len3;i++) printf("%d",c[i]);
	return 0;
}

这个代码我暂时还没弄懂,大家可以帮我看一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值