大整数算法(加减法)

加法:

现将两个数分别计算出长度,然后用将长度较短的数为界,写一个for循环,将两个数从末往前依次相加。这个循环结束后,将长度较大的数组未计入计算的数进行运算

#include<stdio.h>
#include<string.h>
int main()
{
	char a[100],b[100];
	while(~scanf("%s %s",a,b))//输入两个大整数 
	{
		int c[120]={0};//将数组初始化为0 
		int l1,l2; 
		l1=strlen(a);
		l2=strlen(b);
		if(l1>l2)
		{
			int i,j,k;
			k=l1;//两个数相加,那么相加的结果长度最多加1,即c数组长度最长为l1 
			j=l1-1;
			for(i=l2-1;i>=0;i--)//从个位开始相加 
			{
				int x,y,z;
				x=a[j]-'0'+b[i]-'0';
				y=x/10;//大于10的会进位 
				x=x%10;//当前位置该加上的数 
				c[k]=c[k]+x;
				if(c[k]>=10)//一个位数如果大于了10,就进一位 
				{
					c[k]-=10;
					c[k-1]+=1;
				}
				c[k-1]=c[k-1]+y; 
				if(c[k-1]>=10)//若进位的值大于10,就再进一次 
				{
					c[k-1]-=10;
					c[k-2]+=1;
				}
				k--; 
				j--;
			}
			for(;j>=0;j--)//将a数组剩余的数字加起来 
			{
				c[k]=a[j]-'0';
				if(c[k]>=10)
				{
					c[k]-=10;
					c[k-1]+=1;
				}
				k--;
			}
			if(c[0]!=0) printf("%d",c[0]);//检查和的长度是否加一 
			for(i=1;i<l1;i++) printf("%d",c[i]);
			printf("%d\n",c[l1]);
		}
		else
		{
			int i,j,k;
			k=l2;
			j=l2-1;
			for(i=l1-1;i>=0;i--)
			{
				int x,y,z;
				x=a[i]-'0'+b[j]-'0';
				y=x/10;
				x=x%10;
				c[k]=c[k]+x;
				if(c[k]>=10)
				{
					c[k]-=10;
					c[k-1]+=1;
				}
				c[k-1]=c[k-1]+y;
				if(c[k-1]>=10)
				{
					c[k-1]-=10;
					c[k-2]+=1;
				}
				k--;
				j--;
			}
			for(;j>=0;j--)
			{
				c[k]=b[j]-'0';
				if(c[k]>=10)
				{
					c[k]-=10;
					c[k-1]+=1;
				}
				k--;
			}
			if(c[0]!=0) printf("%d",c[0]);
			for(i=1;i<l2;i++) printf("%d",c[i]);
			printf("%d\n",c[l2]);
		}
	}
	return 0;
}

减法:

首先要比较这两个数的大小,然而因为是用一个数组存的,所以先比较其长度,若长度相同,则就用strcmp进行比较。若第一个数小于第二个数,结果就会有一个负号,但是通过数组计算是得不到负号的,所以我就通过比较大小判断是否需要添加负号

#include<stdio.h>
#include<string.h>
char a[100],b[100];
int c[120];
int l1,l2;
void jian(char p[],char q[],int l1,int l2)//计算差值 
{
	memset(c,0,sizeof(c));
	int i,j,k;
	j=l2-1;
	k=0;
	for(i=l1-1;i>=0;i--)
	{
		if(j<0) break;//当q数组计算到最高位时,退出循环 
		int x=0,y,z;
		x=(p[i]-'0')-(q[j]-'0');
		if(x<0)//当p数组里的元素小于q数组的元素时,向高位借一位 
		{
			x+=10;
			p[i-1]--;
		}
		c[k]+=x;//将差值赋给c数组 
		k++;
		j--;
	}
	for(;i>=0;i--)
	{
		c[k]=p[i]-'0';//将未计算的p数组元素的值赋给c 
		k++;
	}
	while(c[k-1]==0) k--;//去掉前导0 
	for(i=k-1;i>=0;i--) printf("%d",c[i]);
	printf("\n");
}
int main()
{
	while(~scanf("%s %s",a,b))
	{
		l1=strlen(a);
		l2=strlen(b);
		if(l1>l2) jian(a,b,l1,l2);
		else if(l1<l2) 
		{
			printf("-");//先输出前面的负号 
			jian(b,a,l2,l1);//将a,b数组位置交换一下 
		}
		else if(strcmp(a,b)>0) jian(a,b,l1,l2);//a,b数组长度相等时,a数组大于b数组的值 
		else if(strcmp(a,b)<0)//a,b数组长度相等时,a<b 
		{
			printf("-");
			jian(b,a,l2,l1);
		}
		else//a,b数组相等 
		{
			printf("0\n");
		}
	}
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较常见的问题,我来为您解答。 首先,我们需要明确一个问题,那就是大整数加减法是如何进行的。我们知道,大整数加减法与小整数加减法的本质是一样的,只是操作的数变成了大整数。因此,我们可以把大整数加减法转化为小整数加减法进行计算。 具体来说,我们可以将大整数按照每9位一组进行拆分,每组最高位可以是1位或者2位,这样每一组就可以转化为一个小整数。然后,我们就可以使用小整数加减法的方法进行计算。最后,将每一组的计算结果拼接起来,就得到了最终的结果。 下面是一个使用整型数组表示大整数加减法的示例代码: ```python #include <iostream> #include <cstring> using namespace std; const int N = 100010; int a[N], b[N], c[N]; // 数组a表示被加数或被减数,数组b表示加数或减数,数组c表示结果 char str1[N], str2[N]; // 输入的两个字符串 int len1, len2; // 两个字符串的长度 void add(int a[], int b[], int c[]) // 大整数加法 { int t = 0; for (int i = 0; i < N; i++) { c[i] = a[i] + b[i] + t; t = c[i] / 10; c[i] %= 10; } } void sub(int a[], int b[], int c[]) // 大整数减法 { int t = 0; for (int i = 0; i < N; i++) { c[i] = a[i] - b[i] - t; if (c[i] < 0) { c[i] += 10; t = 1; } else t = 0; } } void print(int c[]) // 输出结果 { int k = N - 1; while (k > 0 && c[k] == 0) k--; for (int i = k; i >= 0; i--) cout << c[i]; cout << endl; } int main() { cin >> str1 >> str2; len1 = strlen(str1); len2 = strlen(str2); // 将输入的字符串转化为整型数组 for (int i = 0; i < len1; i++) a[i] = str1[len1 - i - 1] - '0'; for (int i = 0; i < len2; i++) b[i] = str2[len2 - i - 1] - '0'; // 大整数加法 add(a, b, c); print(c); // 大整数减法 sub(a, b, c); print(c); return 0; } ``` 需要注意的是,上面的代码只是一个示例,实际上还需要进行很多的优化,例如处理负数、处理进位等问题。另外,如果要进行乘法和除法的运算,就需要使用更加复杂的算法,例如Karatsuba算法和FFT算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值