c语言巨大数,【数据结构与算法】“巨大数!!!” 的计算

巨大数是指一个非常庞大的数,这个数已超过了c语言类型的表示范围,比如:

234531231328473234312445646332523。巨大数的计算是指从键盘输入任意两个巨大数,实现两个巨大数之间的加、减、乘运算。

分析:

上述问题,单纯的用c语言中的基本类型,是很难表示和计算的。由此,先引入一个新的表示方法——万进制。

二进制我们都知道是逢二进一,那么万进制与之类似,逢万进一。

之所以采用万进制,是想把一个巨大数变成四位一组,四位一组的万进制数,无非就是再在每个万进制位上乘以万的几次方的问题。

例如:

5423978134389234 表示成: 5423 9781 3438 9234

存放规则:

我们采用int类型的数组进行存放 ,一个字节存放一个数字。

于是可以定义一个结构体类型:“微易码补码”。

typedef struct HUGE {

boolean sign; //巨大数的符号(正数还是负数)正数用0表示,负数用1表示

int *num;//指向一个数组空间,

int count;//一共有多少个有效的数字(有效数字的个数,最高为是0则需要省略)

}

何为微易码补码?我们都知道二进制补码,正数的补码是其本身,负数的补码,是此负数除符号为外,按位取反,末位加一。且是逢二进一。然而微易码补码是:正数还是其本身,负数则是用9999减去这个数。比如 :

1232 2314 微易码补码 :0: 1232 2314

4 2344 2423 微易码补码 :0: 4 2344 2423

-3423 2323 微易码补码 :1: 6576 7676

-4 6723 1233 微易码补码 :1: 9995 3276 8766

两数相加:

因为两数相加有可能会出现进位,为了防止溢出,在申请空间的时候要多申请一个空间,用来存放两数相加后结果的进位。于是:

1232 2314 微易码补码 :0:0000 1232 2314

4 2344 2423 微易码补码 :0: 0000 0004 2344 2423

-3423 2323 微易码补码 :1: 9999 6576 7676

-4 6723 1233 微易码补码 :1: 9999 9995 3276 8766

进行加法运算的过程如下图所示:

对于上述的两数相加还存在一个问题,假如相加的结果会有进位的话,那么需要把下两个数相加的结果加上进位。

两数相乘:

两数相乘,结果不会多余1 0000 0000,因为我们采用的是万进制表示,把每四个字节看成一个整体,相乘的时候,还是按照乘法原则,依次相乘,只不过需要把乘完的结果进行“同类项”相加,最后再把每个四字节空间超过9999的数的多余的部分进位到下一位即可。如图:

fe01921ad75d4dc3dab1d6343a4ea50f.png

具体代码,见github:https://github.com/xiami-maker/HugeNumber/tree/master

心得体会

在我完成巨大数的计算这一小项目中,有一个很烦人的事情就是输入和输出。

对于输入:为了增强巨大数的可用性,那么输入的可能性会有很多,首先要把开头为0的数除去,除最高位外的0需要保留,因为一个数字的最高为不可能为0,再有就是要把不是数字的字符扔掉。

对于输出:因为采用的是万进制,所以,它的最高位的四个字节存放的不一定全是有效数字,也有可能为0002,此时,输出只能输出2而不能输出0002,还需要另作判断。

对于有关小数的加,减,乘,因为与整数类似,我们可以在结构体中再定义一个小数点位置,专门来记录小数点的位置即可,

typedef struct HUGE {

boolean sign;

int *num;

int count;

int pointLocation;

}HUGE;

实现思路大致相当。

感谢指导教师:铁血教主

本次测验如上所述,如有不足或者可以改进的地方,请指教~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值