大整数运算

大整数存储

由于大整数超过int范围,因此需要运用数组进行存储。但是在进行大整数存储过程中为了方便获取大整数长度,我们还会定义一个int型变量len来记录数组长度,由此可得结构体类型如下:

struct Bign{
  int d[1000];
  int len;
  Bign(){//构造函数,初始化
    memset(d,0,sizeof(d));
    len = 0;
  }
};

进行输入时是先用字符串读入,然后再把字符串另存为Bign结构体。由于读入顺序与整数在数组中的高低位相反,需要进行逆置。

Bign change(char str[])
{
  Bign a;
  a.len = strlen(str);
  for(int i = 0;i < a.len; i++){
     a.d[i] = str[a.len-i-1] - '0';
   }
  return a;
}

大整数比较大小:

int compare(Bign a,Bign b)
{
  if(a.len > b.len) return 1;
  else if(a.len < b.len) return -1;
  else {
     for(int i=a.len-1;i>=0;i++){
        if(a.d[i] > b.d[i]) return 1;
        else if(a.d[i] < b.d[i]) return -1; 
     }
    return 0;
   }
}

大整数四则运算

1,高精度加法

Bign add(Bign a,Bign b)
{
  Bign c;
  int carry = 0;//carry进位
  for(int i = 0;i < a.len||i < b.len;i++)
  {
    int temp=a.d[i]+b.d[i]+carry;//进位加上两个对应位之和
    c.d[c.len++]=temp%10;//个位数为该位结果
    carry = temp/10;//十位数为新的位
  }
  if(carry != 0) c.d[c.len++] = carry;//如果最后进位不为0,直接赋给结果的最高位
  return c;
}

2,高精度减法

Bign sub(Bign a,Bign b){
  Bign c;
  for(int i=0;i<a.len||i<b.len;i++)
   {
     if(a.d[i] < b.d[i]){
       a.d[i+1]--;
       a.d[i]+=10;

      }
     c.d[c.len++] = a.d[i] - b.d[i];
   }
   while(c.len-1>=1&&c.d[c.len-1] == 0){
     c.len--;
   }
   return c;
}

3,高精度与低精度的乘法

Bign multi(Bign a,int b){
 Bign c;
 int carry = 0;
 for(int i=0 ;i < a.len;i++){
   int temp = a.d[i]*b + carry;
   c.d[c.len++] = temp % 10; 
   carry = temp / 10; 
 }
 while(carry!=0){
   c.d[c.len++]= carry % 10;
   carry /= 10;
  }
  return c;
}

4,高精度与低精度的除法

Bign divide(Bign a,int b,int & r)
{
  Bign c;
  c.len = a.len;
  for(int i = a.len-1;i >= 0;i--){
   r= r * 10 + a.d[i];
   if(r < b) c.d[i] = 0;
   else {
     c.d[i] = r / b;
     r = r % b;
    }
  }
  while(c.len - 1 >= 1&&c.d[c.len - 1] == 0){
   c.len--;
  }
  return c;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值