当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 可用于数论计算的无符号大整数类

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 88 ::
收藏到网摘: n/a

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


作者/缪元虎


下载源代码


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

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对齐的问题,使得代码长了一些。但本程序中不用考虑这个问题,所以重新编写。当然也可使用内联汇编的方式,但从编译得到的汇编代码看,在函数体内开始几句语句有点多余。所以用纯汇编编