大数相加

C语言实现-大数相加

使用大数原因
  • 在科学研究或者其他的统计中,很多时候会遇到非常大的数字,这时候就需要用到大数相加的方法来进行相加。(所给数超过了long long 的范围)
  • 以字符串的形式来进行超大数据的相加,理论上只要你的内存允许,相加多大的数都可以。
原理
  • 大数可能超出任何一种整数类型,会引发溢出问题,所以用字符串的格式存储字符串a,b;
    (1)获取字符串a的长度为Len1,字符串b的长度为Len2
    (2)把字符串数组转换为对应的整数
    (2)比较Len1和Len2的大小,数组对齐,方便后续计算。
    (4)用flag作计数器,方便进位
    (3)创建数组c,大小为Len1,a数组与b数组每位相加
    (4)判断是否进位
    (7)还原为字符串数组
    (9)因为两数相加一般从个位开始,一开始进行倒序,运算结束后,从高位到低位输出

代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
void add(char a[],char b[],char c[]){
	int	flag = 0;                 //flag作为计数器,判断进位使用
	int m,n,i,j;
	int	len1 = strlen(a);
	int	len2 = strlen(b);
	for (m = 0;m < len1;m ++)     //把字符串数组转换为对应的整数
	{
		a[m] -= 48;
	}
	for (n = 0;n < len2;n ++)     //同上
	{
		b[n] -= 48;
	}
	if (len1 < len2)              //数组对齐,方便后续计算
	{
		len1 = len2;
	}
	for (i = 0;i <= len1;i ++)    //核心算法
	{
		c[i] = a[i] + b[i];       //每位相加
		if (flag == 1)            //计数器如果为1,进位加一,计数器归零
		{
			c[i] ++;
			flag = 0;
		}
		if (c[i] > 9)
		{
			c[i] -= 10;           //大于9,进位,计数器值变为1
			flag = 1;
		}
	}
	for (j = 0;j <= len1;j ++)    //还原每一位,成为字符串数组
	{
		c[j] += 48;
	}
	if (c[len1] == '0')           //头位如果是零,不打印该位
	{
		c[len1] = 0;
	}
}

void swap(char p[])               //使数组倒序,方便在循环中进行进位运算
{
	int	i,k;
	for (i = 0;i < strlen(p) / 2;i ++)
	{
		k = p[i];
		p[i] = p[strlen(p)-1-i];
		p[strlen(p)-1-i] = k;        //交换
	}
}


int	main()
{
	char a[10000];        //创建数组,定义大小 
	char b[10000];
	char c[10000] = {};   //定义数组
	gets(a);
	gets(b);
	swap(a);    //数组倒序 
	swap(b);    //数组倒序 
	add(a,b,c);
	swap(c);    //重新倒序使其变为原有顺序 
	puts(c);
	system("pause");//暂停程序 
	return	0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值