基于C语言的大数加法

一、了解大数加法

        大数加法,顾名思义,就是对很大的数进行加法运算。

        大数在不同的领域有不同的涵义,关于大数是说法有下面5种。

        1. 交易员术语,指汇率的头几位数字。

        2. 数学用语,指两个数中较大的数。

        3.代表十的七十二次方.

        4.大数在编程中表示超过32位二进制位的数.

        5.命运注定的寿限。如在《东周列国志》第一回:“只见杜伯、左儒齐声骂曰:‘无道昏君!你不修德政,妄戮无辜,今日大数已尽,吾等专来报冤。还我命来!’”

        在数学中,数值的大小没有上限,但是在计算机中,由于字长的限制,计算机所能表示的范围有限,对于很大的数,计算机无法对其进行直接计算,需要用到所谓的高精度算法,即用数组来存储整数,并模拟手算的方法进行四则运算。

二、计算机中实现大数加法的方法

        当大数其位数超过计算机的数据类型的范围时,计算机无法对其进行直接计算,需要用到所谓的高精度算法,即用数组来存储整数。所以在进行大数加法运算时我们需要先定义两个数组分别来存储这两个大数。

        通常,我们进行两个数的加法运算时,先将各位相加,若个位相加之后的和大于十,则需要向十位进一,然后再对十位进行相加,依次从后位往前位进行加法运算。

        这里我们进行大数加法运算时同样也需要从末尾开始运算,所以我们可以使用循环先分别从存储两个大数的数组中依次从末尾到开始拿出个位、十位、百位......然后其对应的进行相加,再把结果存储到另一个新的数组中,最后将存储结果的数组中的元素倒序输出,其结果就是两个大数相加的结果。

三、程序代码

#include <stdio.h>
// 倒序字符串
void str_rts(char *s)
{
	char*p=s;
	while(*p) p++;
	p--;
	for(;s < p;s++,p--)
	{
		*p ^= *s;
		*s ^= *p;
		*p ^= *s;
	}
}

char b[] =
"1283461973258176325874124\
35878032743712098317867293728651279";
char a[] =
"9080202033923787772398789\
50493849938744869530984603429835934";
char c[200];

int main()
{
	char *pa = a;
	char *pb = b;
	//定义各位数的整型值存储
	int ga,gb,gc,flag = 0;//flag 进位标志
	int i = 0; //c中的存储位置

	printf("a=%60s\nb=%60s\n",a,b);
	//找到ab的末尾字符地址
	while(*pa) pa++;
	pa --;
	while(*pb) pb++;
	pb --;
	//按位计算 从末尾开始
    for(;a <= pa || b <= pb;pa--,pb--,i++)
	{
		if(pa >= a)//判断指针越界否
		  ga = *pa - '0'; 
		else 
		  ga = 0;//a 短于 b 补0 
		if(pb >= b)
		  gb = *pb - '0';
		else 
		  gb = 0;//b 短于 a 补0

		gc = ga + gb + flag;
		if(gc > 9)//判断是否进位 
		{
			flag = 1;
			gc %= 10; 
		}
        else 
		{
			flag = 0;
		}
		c[i]  = gc + '0';
	}
	//判断溢出否
	if(flag)
	  c[i++] = '1';
	//给c添加结束符'\0'
	c[i] = '\0';
	//倒叙c
	str_rts(c);	
	printf("c=%s\n",c);
	printf("i=%d\n",i);
	return 0;
}


 四、运行结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,我们可以使用数组来实现大数加法。首先,我们需要定义一个数组来保存大数的每一位数字,然后从个位开始进行逐位相加,并处理进位。 下面是一个使用C语言实现大数加法的示例代码: ```c #include <stdio.h> #include <string.h> #define MAX_DIGITS 1000 void addBigInt(char* a, char* b, char* result) { int lenA = strlen(a); int lenB = strlen(b); // 将数组初始化为0 int sum[MAX_DIGITS] = {0}; // 从个位开始逐位相加,并处理进位 int carry = 0; int i = 0; for (; i < lenA || i < lenB || carry != 0; i++) { if (i < lenA) { carry += a[lenA - 1 - i] - '0'; } if (i < lenB) { carry += b[lenB - 1 - i] - '0'; } sum[i] = carry % 10; carry /= 10; } // 将结果转为字符串形式 int lenSum = i; for (int j = 0; j < lenSum; j++) { result[j] = sum[lenSum - 1 - j] + '0'; } result[lenSum] = '\0'; } int main() { char result[MAX_DIGITS]; char factorial[MAX_DIGITS] = "1"; // 计算1!+2!+3!+...+50! for (int i = 2; i <= 50; i++) { char num[MAX_DIGITS]; sprintf(num, "%d", i); char temp[MAX_DIGITS]; addBigInt(factorial, num, temp); strcpy(factorial, temp); addBigInt(result, factorial, temp); strcpy(result, temp); } printf("%s\n", result); return 0; } ``` 在上述代码中,我们定义了一个`addBigInt`函数来实现大数相加。首先,我们通过`strlen`函数获取两个大数的长度,然后使用一个数组`sum`来保存每一位的和。接着,我们从个位开始逐位相加,并将进位保存在`carry`变量中,直到所有位数都相加完毕。 最后,我们将结果转换为字符串形式并打印出来。 运行上述代码,将会得到结果:333222235136048752564709397395796481570128393455295413410022。 注意:由于阶乘的结果非常大,所以要确保数组大小足够大来保存计算结果。以上代码中使用了`#define MAX_DIGITS 1000`来定义数组的大小。如果要计算更大的阶乘和,请相应增大数组的大小。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值