文章目录
一、巨大数的基本概念
巨大数的基本概念:位数趋近于无限的数字。
二、巨大数的由来在这里插入代码片
当前计算机对于数据的处理在一般情况下,只能处理一些固定类型并且固定长度的数据。例如,在对于c语言提供了许多整数类型,int类型(范围:-2147483648~2147483647),float类型(可表示的数据范围是 -3.4E+38 和 3.4E+38)和double类型(可表示的数据范围-1.7E-308~1.7E+308),但是float的有效位数只有7位,double类型的有效位数也只有15位,处理数据不够精确。要处理的数据的位数越多,丢失的信息量也越大。因此我们提供一种对位数超出表示范围的数据的处理工具——也就是这个巨大数的处理工具。
三、万进制基本概念
万进制的原理同二进制十进制是一样的,二进制是逢二进一,同理万进制就是逢万进一。
1,首先用字符串(char hugeNum[ ])存储巨大数。
2,用atoi函数将字符串转化为整形(int类型)的数组,并且按照四个一组的方式存储到整形数组中。这就需要记录数字的长度,而且还需要考虑符号位的问题。
由此我们可以的出计算巨大数所需要的基本数据 :
1. int sign 巨大数的符号
2. int *huge 巨大数的数据
3. int count 巨大数的数据位数
即:
typedef struct HUGE_NUMBER {
int sign; /* 取值为 0 或 1 ,其中0 代表正号, 1代表负号(符号域)*/
int *huge; /* 巨大数的整数部分(数据域)*/
int count;/* 数据的位数(十进制情况下)*/
}
四、为什么是万进制而不是十万进制
因为我们决定用整形数组的方式存储巨大数,为了方便而使用int类型。之所以使用万进制,而不用更高的进制位,是因为在涉及乘法的计算中依然要是数据保持在int类型可以表示的范围之内(例:若使用十万进制,当出现99999×99999 = 9999800001,但是很明显9999800001已经超出了int类型的表示范围,因此一万进制是最合适的进位)。
五、微易码补码的概念
获得微易码补码的具体操作与求补码相似,除符号位外,对于整数,其微易码补码与原码相同,对于负数,其微易码补码为9999-源码(huge[ i ])。
例如: