大整数的存储
定义int型数组d[1000],整数的高位存储在数组的高位,整数的低位存储在数组的低位。
而把整数按字符串读入的时候,实际上是逆序存储的 。因此在读入之后需要另存到d[]数组的时候需要反转一下。
定义大数 数据类型 bign:
struct bign{
int d[1000];
int len;
bign()
{
fill(d,d+1000,0);
len=0;
}
};
输入大整数的时候,一般都是先用字符串读入,然后再把字符串另存为bign结构体。由于使用char数组进行读入时,整数的高位会变成数组的低位,而整数的低位会变成数组的高位,因此为了让整数再bign中是顺位存储,需要让字符串倒着赋给d[]数组。
//将整数转换为bign
bign change(char str[])
{
bign a;
//bign的长度就是字符串的长度
a.len=strlen(str);
for(int i=0;i<len;i++)
{
//逆着赋值
a.d[i] = str[a.len- i-1]-'0';
}
return a;
}
如何比较两个bign类型的变量的大小呢?先判断两者的len的大小,如果不相等,就是长的大;如果相等,则从高位到低位进行比较,直到出现某一位不等 ,就可以判断两个数的大小。
//比较a和b的大小,a大、相等、a小分别返回1、0、-1
int compare(bign a,bign b)
{
if(a.len > b.len)
{
return 1;//a大
}
else if( a.len < b.len )
{
return -1;//a小
}
else
{
//从高位往低位比较
for(int i= a.len-1;i>=0;i-- )
{
if( a.d[i]>b.d[i] )
{
return 1; //a大
}
else if( a.d[i]<b.d[i] )
{
return -1;//a小
}
}
return 0; //两数相等
}
}