大数加法,减法,乘法,除法(C语言简化版)

大数加法:
大数加法算是在大数运算里面算是最简单的了,他只需要把两个大数以字符串的形式存取数组,然后从最后一位开始往前加,如果当前数值加的结果大于9就进位,否则就把加的结果存入当前数组就可以(我用的是另一个数组存,也可以用第一个存数据的数组存储),另外注意的就是去除前导0问题,从最后一位检查数组是否当前值是否为0,是的话就往前减一,但是i的值要大于0(结果可能是0)
下面就是AC代码:

#include<stdio.h>
#include<string.h>
int a[2000],b[2000],c[2000];
char s[2000],p[2000];
int main()
{
	int i,k,j,n,m;
	while(scanf("%s %s", s,p))
	{
		memset(c,0,sizeof(c));
		n=strlen(s);
		m=strlen(p);
		for(i=0; i<n; i++)
		   a[i]=s[n-i-1]-'0';
		for(i=0; i<m; i++)
		   b[i]=p[m-i-1]-'0';
		k=(m>n)?m:n;
		for(i=0; i<=k; i++)
		{
			c[i]+=a[i]+b[i];
			if(c[i]>9)
			{
				c[i+1]++;
				c[i]%=10;
			}
		}
		while(c[k]==0&&k>0) k--;
		for(i=k; i>=0; i--)
			printf("%d", c[i]);
		printf("\n");
	}
	return 0;
}

大数减法:
大数减法是在大数加法的思想基础上进行运算的;还是用两个字符串存入两个大数,但是需要判断两个大数的大小,决定是前减后还是后减前;判断的方法是:
(此处用一个变量表示即如果前者大定义的变量值为0否则为1)位数大的肯定大,然后尾数相等的话可以用strcmp函数判断两个数的大小,如果两个数相等返回值为0,前者大为正数,后者大为负数:其他的看代码肯定也就能理解了;
AC代码:

#include<stdio.h>
#include<string.h>
int a[2000],b[2000],c[2000];
char s[2000],p[2000];
int main()
{
	int n,m,i,j,k;
	while(scanf("%s %s", s,p)!=EOF)
	{
		int flag=0;
		memset(c,0,sizeof(c));
		n=strlen(s);
		m=strlen(p);
		k=(n>m)?n:m;
		for(i=0; i<n; i++)
		  a[i]=s[n-i-1]-'0';
		for(i=0; i<m; i++)
		  b[i]=p[m-i-1]-'0';
		if(n<m)
		flag=1;
		if(n==m)
		{
			if(strcmp(s,p)<0)
			flag=1;
		}
		for(i=0; i<k; i++)
		{
			if(flag==0)
			{
				if(a[i]<b[i])
				{
					a[i+1]-=1;
					a[i]+=10;
				}
				c[i]=a[i]-b[i];
			}
			else if(flag==1)
			{
				if(a[i]>b[i])
				{
					b[i+1]-=1;
					b[i]+=10;
				}
				c[i]=b[i]-a[i];
			}
		}
		while(c[k-1]==0&&k!=1) k--;
		if(flag==1)
		printf("-");
		for(i=k-1; i>=0; i--)
		 printf("%d", c[i]);
		printf("\n");
	}
	return 0;
}

大数乘法:
大数乘法也是用到了大数加法只不过是在算的时候是用第二个的数的每一位去乘以第一个大数在运算的时候直接考虑进位,后面就再考虑一下进位就可以;看代码在理解一下应该可以明白;
代码:

#include<stdio.h>
#include<string.h>
int a[2000],b[2000],c[2000];
char s[2000],p[2000];
int main()
{
	int i,j,k,t,slen,plen;
	while(scanf("%s %s", s,p)!=EOF)
	{
		memset(c,0,sizeof(c));
		slen=strlen(s);
		plen=strlen(p);
		for(i=0; i<slen; i++)
		    a[i]=s[slen-i-1]-'0';
		for(i=0; i<plen; i++)
			 b[i]=p[plen-i-1]-'0';
	    for(i=0; i<slen; i++)
		{
			for(j=0; j<plen; j++)
			{
				c[i+j]+=a[i]*b[j];
		        c[i+j+1]+=c[i+j]/10;
			    c[i+j]=c[i+j]%10; 
			}
		} 
		  k=slen+plen;
		  while(c[k]==0&&k>0) k--;
		  for(i=k; i>=0; i--)
		   printf("%d", c[i]);
		  printf("\n"); 
	}
	return 0;
}

大数除法:
明天再写!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮皮皮皮皮皮卡乒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值