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

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

一、类的基本结构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次,采用逻辑右移算法,所以这个函数将丢失余数。

时间: 2024-08-31 12:28:03

可用于数论计算的无符号大整数类的相关文章

C#基于大整数类的RSA算法实现(公钥加密解密,私钥加密解密)

最近因为项目需要通过RSA加密来保证客户端与服务端的通信安全.但是C#自 带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证 书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实 现是基于网上提供的一个大整数类. 一.密钥管理 取得密钥主要 是通过2种方式 一种是通过RSACryptoServiceProvider取得: /// <summary> /// RSA算法对象,此处主要用于获取密钥对 /// </summary&g

【Java编程】Java中的大整数计算

在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试.本来我准备用Java代码实现大整数的运算,查了一下资料发现Java中java.math的BigInteger可以实现大整数的表示和计算.BigInteger 还提供以下运算:模算术.GCD 计算.质数测试.素数生成.位操作以及一些其他操作. 下面通过程序来看看具体用法: import java.math.BigInteger; public class BigInt { public sta

《C和C++程序员面试秘笈》——1.6 看代码写结果—有符号变量与无符号变量的值的转换

1.6 看代码写结果-有符号变量与无符号变量的值的转换 C和C++程序员面试秘笈考点: 有符号变量与无符号变量的区别和联系 出现频率: #include <stdio.h> char getChar(int x, int y) { char c; unsigned int a = x; (a + y > 10)? (c = 1): (c = 2); return c; } int main(void) { char c1 = getChar(7, 4); char c2 = getCha

请问值对于无符号的字节太大或太小怎么解决

问题描述 有关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾.**************异常文本**************System.OverflowException:值对于无符号的字节太大或太小.在System.Byte.Parse(Strings,NumberStylesstyle,NumberFormatInfoinfo)在DITCollect_RTU.RVU90SWFB.CClient_CommuniteCQ._FrmYCZC_YCZC(CmdEventArg

深入分析C语言中的有符号和无符号

就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负.如果这个量不会有负值,那么我们可以定它为带正负的类型. 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型. (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型. 字符类型也分为有符和无符类型. 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型. 2.使用二制数中的最高位表

C语言参考程序—无符号一位整数的四则运算

题目:输入一个无符号的一位整数的四则运算表达式,输出其结果.例如输入:1+3*6-2,则输出:17 分析:因为不涉及到括号,只是简单的四则运算,我的想法是如果有乘除法先计算,没有的话就按照加减法从左到右的顺序进行计算.在开始的时候,首先检查是否有乘除法运算符,有的话就取出前后两个操作数进行计算,将结果保存起来.没有的话就将加减运算符先存起来. 主要过程: 1.输入的是一个四则运算的表达式,在计算机中按照字符串的形式存储.数据和运算符需要分开处理. 2.引入一个整型的数组,其大小为字符串长度加一,

C语言之将无符号字符型转化为ascii码值

这个宏是在linux内核中获取的,主要的功能是能够将一个无符号字符型的参数转化为ASCII码值. ASCII : ASCII 编码里包括了128个字符.用 十进制 0  到 127 来表示 .那就对了, 0 到 127 不就是 128个字符吗. 每一个数字都代表一个字符.看ASCII 编码表 我们来看看代码: #include <stdio.h> #include <stdlib.h> #define toascii(c) (((unsigned char)(c))&0x7

c语言-有符号加法,无符号减法溢出处理的C程序,并运用条件编译指令。。

问题描述 有符号加法,无符号减法溢出处理的C程序,并运用条件编译指令.. 这是我们老师布置的实验题,请教大神.. 实验名称:跨系统的整型数据类型运算 实验目的:理解不同系统之间存在数据类型的不兼容,理解C语言中为不同系统设计统一数据类型头文件,比如stdint.h. 实验内容: 1.编码实现一个**.c 和**.h两个文件,这**.C中的函数可以让其它程序能过包含**.h引用."**"根据个人喜好命名. 2.只在小端的系统上运行程序: 3.在**.c中实现以下功能的函数, 函数1: i

c语言-关于C语言无符号规格化的一个理解

问题描述 关于C语言无符号规格化的一个理解 看深入理解计算机系统里面.关于规格化的一段描述:......也就是说,指数的值是E=e-Bias其中e是无符号数,其位表示为ek-1···e1e0而Bias是一个等于2k-1 -1(单精度是127,双精度是1023)的偏置值..... 我知道C语言单精度的指数位是8位,取值范围是-126到127.但是我对E=e-Bias不理解.这里的e代表的是什么?本人小白求解释.. 解决方案 e就是你的指数值,给个例子 0100 0010 1**111 0110 0