发这个帖子, 是因为我昨天突然想到了一个事情, 那就是数学的多位数加减运算都可以被抽象为一组组个位数加减运算.
举个例子:
7748 + 1304
每次计算都可以被简化为每一个位的"加数1+加数2+上一位的进位"的结果, 而结果的个位为那一位结果的表示, 十位则为下位运算的进位计算.
所以上面那个式子计算可以被抽象如下:
个位: 8(加数1) + 4 (加数2) + 0 (进位) = 12. 1为进位, 2为个位结果
十位: 4(加数1) + 0 (加数2) + 1 (进位) = 5. 没有进位, 5为十位结果
百位: 3(略) + 7 (略) + 0 (略) = 10, 略
千位: 7 + 1 + 1 = 9
所以计算结果为9052.
而减法即为执行加法的反操作. 为方便, 先提前执行借位, 给当位的减数先增加10, 然后执行相减, 如果结果大于等于10, 则作为下一位的进位, 即下一位数字不变. (其实也可以判断结果的正负或当位数字的大小来判断是否进位)
基本操作为:
(10 (顶位除外, 在此处不考虑被减数大于减数的情况, 此时先判断大小然后取原被减数减减数的相反数) + 被减数 - 1 (个位除外) ) - 被减数 + 上一位进位 = 结果, 十位为进位, 个位为当位结果
如 7904 - 1748
抽象如下:
个位: (10 + 4 - 0) - 8 + 0 = 6
十位: (10 + 0 - 1) - 4 + 0 = 5
百位: (10 + 9 - 1) - 7 + 0 = 11
千位: (0 + 7 - 1) - 1 + 1 = 6
所以结果为: 6156
除此之外, 乘法也可以实现对每一个数位的计算, 而除法计算也可以在实现乘法计算后实现.
那么问题来了: 这些有什么用呢?
可以很明显看到, 无论多么大的位数的四则运算, 都可以被抽象为一位位的个位数四则运算, 而实行这些运算只要根据实际位数实施循环即可完成.
所以得到结论: 通过这个设想, 我们可以突破计算机原有的CPU单位运算限制, 实现非常大的位数的计算!
(前提条件是电脑内存够大, 因为这些数字实际上是作为数组配置在内存之中)
最后奉上我的用于表示巨大数字的结构体, 供作参考:
/*++
结构体说明:
本结构体用于表述一个巨大的数字.
表述范围为小数点前后480位. 使用十进制表达.
申明: 为照顾作者的数学习惯, 本程序中LAGRE_NUM的数字为倒序排列.
浮点模式下, DecNumber的第479位为整数部分第一位, 递减.
DecNumber的第480位为小数部分第一位, 递增.
整形模式下, DecNumber的第979位为整数部分第一位, 递减.
变量:
DecNumber (char [960]) - 用于表达数字的每一位.
type (unsigned int) - 数字的类型.
当第一位为1(LNTYPE_INT)时, 此数字为整形数字.
当第二位为1(LNTYPE_SIGN)时, 此数字为负数.
size (unsigned int) - 此数字小数点之前的位数.
ftsize (unsigned int) - 此数字小数点之后的位数.
在type被标记为LNTYPE_INT时, 此值被忽略.
--*/
struct tagLARGENUM_DEC {
char DecNumber[960]; //小数点之前480位, 小数点之后480位 (也可解释为整形960位)
unsigned int type, size, ftsize;
} typedef LARGENUM_DEC, *PLNUM_DEC;
(语文水平实际上是差到极点了, 这篇文章非常崩... 23333)