本来利用一般的思想的是一个数组位存一位数, 需要初始化数组a[1024],但是可以利用更节省空间的方法。
C语言unsigned int 的范围是0-2^32-1,一个数组位就可以存32bit(1个int = 4Bytes = 4*8bit = 32 bit),
1024比特用初始化数组a[1024/32]=a[32]可以储存完。在本程序中,我用a[0]代表实际数组的长度,
因此1024比特位的大数需要用数组a[33]存储。
bitmap思想
举一个例子 :其中0X代表16进制
a[33]={1, 0}代表数字为0的数
a[33]={1, 1}代表数字为1的数
a[33]={2,0xffffffff,1}所代表的数字大小是2^32的数
若要实现 a[33]={1, 0xffffffff}, b[33]={1, 0x1} 的加法 ,
二进制中32比特的加法如下图所示:
需要向前进1,我们可以将a[2]赋值为1,故数组a,b相加可以得到数组c是c[34]={2,0x0,0x1}
数组初始化大小为0的程序是
/***************************************************************************************************
初始化大数对象,且数组第一位是数组的实际长度
****************************************************************************************************/
void Init(unsigned int *x)
{
int i;
for (i = 1; i < MAX; i++)
x[i] = 0;
x[0] = 1;
}
比较两个数组的大小
/***************************************************************************************************
大数比较
调用方式Cmp(x, y)
返回值,若x<y返回 - 1;若x>y返回1; 若x = y返回0
*****************************************************************************************************/
int Cmp(unsigned int x[], unsigned int y[])
{
int i;
if (x[0] > y[0])
return 1;
if (x[0] < y[0])
return -1;
for (i = MAX - 1; i >= 1; i--)
{
if (x[i] < y[i])
return -1;
if (x[i] > y[i])
return 1;
}
return 0;
}
数组赋值
/****************************************************************************************************
大数赋值
调用方式Mov(x,y)
返回值:y被赋值为x;
*****************************************************************************************************/
void Mov_Big(unsigned int x[], unsigned int *y)
{
int i;
for (i = 0; i <= x[0]; i++)
{
y[i] = x[i];
}
if (x[0] < MAX)
for (i = x[0] + 1; i < MAX; i++)
{
y[i] = 0;
}
}
/****************************************************************************************************
大数相加
调用方式Add(x,y,z)
返回值,z=x+y
*****************************************************************************************************/
void Add_Big(unsigned int x[], unsigned int y[], unsigned int *z)
{
int i;
unsigned int t[34];
unsigned int carry = 0;
unsigned long long sum = 0;
Init(t);
Mov_Big(x, t);
if (t[0] < y[0])
{
t[0] = y[0];
}
for (i = 1; i <= t[0]; i++)
{
sum = y[i];
sum = sum + t[i] + carry;
t[i] = (unsigned long)sum;
carry = (unsigned int)(sum >> 32);
}
if (carry != 0)
{
t[t[0] + 1] = carry;
t[0] = t[0] + 1;
}
Mov_Big(t, z);
}
大数运算c语言运算结果