C 数据结构之高精度整数

       当我们遇到一些数值非常巨大的整数以至于我们不能用任何一种数据类型来保存他的值,这个时候我们要考虑使用一个结构体来保存这个整数,并完成对其运算的实现。

1.实现一个加法器。使其能够输出a+b的值

输入包括两个数a和b,并且都不超过1000位,输出a+b的值
样例输入:
2 6
10000000000  1000000000000000 
样例输出:
8

1000010000000000 

思路:定义一个结构体来保存一个高精度整数

struct bigInteger
{
	int digit[1000]; 
	int size;
}
digit数组保存大整数中每若干位数字,这里使用每4位一组。size表示digit数组中第一个还没有使用的数组单元。以整数123456789为例,gigit[0]=6789,digit[1]=2345,digit[2]=1,size=3。用代码模拟加法的运算法则,按照从低到高相加并加上来自低位的进位的规则进行运算。
#include<stdio.h>
#include<string.h>
struct bigInteger//高精度整数结构体 
{
	int digit[1000];//按四位数一个单位保存数值 
	int size;
	void init() //对结构体的初始化 
	{
		for(int i=0;i<1000;i++) digit[i]=0; //所有数位清0 
		size=0;
	}
	void set(char str[])//从字符串中提取整数 
	{
		init();//对结构体初始化 
		int L=strlen(str);
		for(int i=L-1,j=0,t=0,c=1;i>=0;i--)
		{//从最后一个字符开始倒序遍历字符串,j控制每4个字符转化为一个数字
		//t 临时保存字符转化为数字的中间值,c表示当前位的权重,按1,10,100,1000顺序变化 
			t+=(str[i]-'0')*c;
			//计算这个四位数中当前字符代表的数字,即数字乘以权重 
			j++;//当前转换字符数增加 
			c*=10;//计算下一位权重 
			if(j==4 || i==0)
			{//若已经连续转换4个字符,或达到最后一个字符 
				digit[size++]=t;//将这四个字符代表数字存入数组,size移动到下一个数组单位 
				j=0;//重新开始计算下4个字符 
				t=0;//临时变量清0 
				c=1;//权重变为1 
			}
		}
	}
	void output()//将高精度整数输出 
	{
		for(int i=size-1;i>=0;i--)
		{
			if (i!=size-1) printf("%04d",digit[i]);
			//若当前输出不是最高位数字 输出前导0;当前数字不足4位由0补充,如输出110001的后四位数 
			else printf("%d",digit[i]);
		}
		printf("\n");
	}
	bigInteger operator +(const bigInteger &A) const//加法运算符 
	{
		bigInteger ret;//返回值,两数相加结果 
		ret.init();
		int carry=0;//进位,初始值为0 
		for(int i=0;i<A.size || i<size;i++)
		{
		    int tmp=A.digit[i]+digit[i]+carry;
		    //计算两个整数当前位以及来自低位的进位和 
			carry=tmp/10000;//计算该位的进位 
			tmp%=10000;//去除进位部分取后四位 
			ret.digit[ret.size++]=tmp;//保存该位结果 
		}
		if(carry!=0)//计算结束后若高位有进位 
		{
			ret.digit[ret.size++]=carry;//保存该进位 
		}
		return ret;
	}
} a,b,c;
char str1[1002],str2[1002];
int main()
{
	while(scanf("%s%s",str1,str2)!=EOF) //输入 
	{
		a.set(str1);b.set(str2);//用两个字符串设置两个高精度整数 
		c=a+b;
		c.output();
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值