可用于数论计算的无符号大整数类

122fsdafd

122fsdafd

2016-01-29 12:23

可用于数论计算的无符号大整数类,可用于数论计算的无符号大整数类

可用于数论计算的无符号大整数类


作者/缪元虎

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)


下载源代码


  前些日子,无意中访问到三思科学网,里面介绍了许多数论问题,这也是我儿时的爱好,于是就利用空闲时间编写了一个用于数论计算的无符号大整数类。
   
一、类的基本结构

Class CUSuperInt{public:       //构造及析构函数       CUSuperInt();       CUSuperInt(DWORD dwValue);       CUSuperInt(char* pszVal);       CUSuperInt(CUSuperInt& x);          virtual ~CUSuperInt();protected:       DWORD *pValue;         //指向一个DWORD数组,用于存放数值       DWORD len;                //DWORD数组的长度       DWORD last;               //数组中的有效长度};      
  类名为CUSuperInt,第二个字母表示无符号的意思。当然只要你通过增加一个表示符号的成员,再经简单扩充即可变成有符号大整数类。
  pValue指向的DWORD数组采用动态分配策略,当数组长度不够时,采用成倍分配的策略,即长度变为2*len。(这也许不是一个最好的分配方案,但可以简化设计)
  last成员指示数组中数据的有效长度,这样可以减少一些不必要的运算量。last成员最小值为1,当last=1时实际就已蜕变为了一个DWORD了。

二、构造函数
  类定义了四个构造函数,其中有一个构造函数的参数是一个字符串指针,它表示将一个字符串转换为一个CUSuperInt类。这样的字符串可以是十进制或十六进制的字符串,表示方式跟C语言的规范差不多,如"12345678901","0x123456789abcdef",前者表示十进制数,后者表示十六进制数。同时为了在应用中方便,也允许数字字符串中间用空格来分节,如"12345 567890"、"0x123 4567 89ab cdef"等。

三、重载运算符
  重载了赋值运算符,可以将DWORD,字符串,以及CUSuperInt赋值给一个CUSuperInt对象。
重载了加减乘除等四则运算,以及++,――运算符。不过注意对于/=运算返回值为余数,商在左操作数中。而对于/运算返回商,余数丢失。
重载了%运算符,可以计算模。
重载了比较运算符,可以进行比较运算,返回一个bool值。
定义了一个Dobule()成员用于乘以2的n次方,有用逻辑左移算法。
定义了一个Half()成员用于除以2的n次,采用逻辑右移算法,所以这个函数将丢失余数。

四、数据的输出
  定义了ToDecStr()和ToHexStr()两个成员分别用于将其转换为十进制和十六进制字符串输出。

五、处理0除和越界异常
  自定义了一个CMyException异常类。
越界是指由于机器字长的影响,使得内存(包括虚拟内存)的大小有限,自定义了一个上界,当数据越过时抛出一个越界异常。
  事实上一个win32程序可用的内存空间名义上有4G,实际除了操作系统和一些额外开销,不足2G,一个DWORD占4字节,所以最大长度为2G/4= 0x20000000;加上要运算,肯定有多个数,考虑MaxLen为0x1000000比较合适,这时能表示的数表示成十进制数能超过1.6亿位,已经非常大了。这个长度计算公式是MaxLen * 32位 * log(2) / log(10) + 1;

六、使用
  如同整数一样可以进行加减乘除四则运算和比较。如果你处理的数很大时,一般建议你在程序中要处理异常。例子代码见源程序。另外建议将你的程序优先级设置得低些,因为数值运算是非常耗CPU资源的。

七、优化
  优化要从算法和代码上进行。在代码上,核心代码尽量用内联汇编代码编写,以提高速度。对于一些经常使用的函数,可以考虑采用VC和汇编混合编写的方法,程序中使用了这样一个例子,即对meccpy函数用汇编编写。(系统提供的这个函数因为要考虑按DWORD对齐的问题,使得代码长了一些。但本程序中不用考虑这个问题,所以重新编写。当然也可使用内联汇编的方式,但从编译得到的汇编代码看,在函数体内开始几句语句有点多余。所以用纯汇编编
展开更多 50%)
分享

猜你喜欢

可用于数论计算的无符号大整数类

C语言教程 C语言函数
可用于数论计算的无符号大整数类

可用于胎教的10首曲子

分娩
可用于胎教的10首曲子

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

男人吃芹菜可用于产后避孕

怀孕
男人吃芹菜可用于产后避孕

木瓜炖鱼头可用于产后催乳

孕妇食谱
木瓜炖鱼头可用于产后催乳

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

检测整数和长整数的函数

ASP
检测整数和长整数的函数

一个用于MySQL的PHP XML类

PHP
一个用于MySQL的PHP XML类

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

JDBCTM 指南:入门7-CallableStatement

JDBCTM 指南:入门7-CallableStatement

《讨鬼传 极》讨伐夜刀主视频及攻锁镰配魂推荐

《讨鬼传 极》讨伐夜刀主视频及攻锁镰配魂推荐
下拉加载更多内容 ↓