数论: 大数类 (总结的时候了!)

 

通过C++将大数的操作放进类,制作成大数类(刘汝佳代码 + 自己添加的除法,次方,求余).

 

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAX 200
inline int max(int a,int b) { return a > b ? a : b; }

struct bign
{
//初始化.
 int len, s[MAX];
 bign() { memset(s,0,sizeof(s)); len = 1; }
 bign(int num) { *this = num; }
 bign(const char *num) { *this = num; }
 
 bign operator= (const char *num)
 {
  len = strlen(num);
  for(int i = 0; i < len; ++i)
   s[i] = num[len-i-1] - '0';
  return *this;
 }
 
 bign operator= (int num)
 {
  char str[MAX];
  sprintf(str,"%d",num);
  *this = str;
  return *this;
 }
//判断大小 
 bool operator< (const bign &b) const
 {
  if(len != b.len) return len < b.len;
  for(int i = len-1; i >= 0; --i)
   if(s[i] != b.s[i])
    return s[i] < b.s[i];
  return false;
 }
 
 int compare(const bign &b)
 {
  if(len > b.len) return 1;
  if(len < b.len) return -1;
  int i = len;
  while( (i>1) && (s[i] == b.s[i]) ) i--;
  return (s[i]-b.s[i]);
 }

//辅助函数 
 void clean() { while(len > 1 && !s[len-1]) len--; }
 
 string str() const
 {
  string res = "";
  for(int i = 0; i < len; ++i)
   res = (char)(s[i] + '0') + res;
  if(res == "") res = "0";
  return res;
 }
//加减乘除 
 bign operator+ (const bign &b) const
 {
  bign c;
  c.len = 0;
  for(int i = 0,g = 0; g || i < max(len,b.len); ++i)
  {
   int x = s[i] + b.s[i] + g;
   c.s[c.len++] = x % 10;
   g = x / 10;
  }
  c.clean();
  return c;
 }
 
 bign operator+= (const bign &b)
 {
  *this = *this + b;
  return *this;
 }
 
 bign operator* (const bign &b)
 {
  int i, j;
  bign c;
  c.len = len + b.len;
  for(i = 0; i < len; ++i)
  {
   for(j = 0; j < b.len; ++j)
   {
    c.s[i+j] += s[i] * b.s[j];
   }
  }
  for(i = 0; i < c.len-1; ++i)
  {
   c.s[i+1] += c.s[i] / 10;
   c.s[i] %= 10;
  }
  c.clean();
  return c;
 }

 bign operator- (const bign &b)
 {
  bign c;
  c.len = 0;
  for(int i = 0,g = 0; i < len; ++i)
  {
   int x = s[i] - g;
   if(i < b.len) x -= b.s[i];
   if(x >= 0) g = 0;
   else
   {
    g = 1;
    x += 10;
   }
   c.s[c.len++] = x;
  }
  c.clean();
  return c;
 }

 int operator/ (const bign &b)
 {
  int c = 0;
  bign t = *this;
  while(t >= b) { t = t-b; c++; }
  return c;
 }
 
//次方, 求余, 开方根. 
 bign pow(int cifang) //O(logn)
 {
  if(cifang == 0) return 1;
  bign x = pow(cifang/2);
  bign ans = x * x;
  if(cifang % 2 == 1) ans = ans*(*this);
  return ans;
 }
 
 bign operator% (const bign &b) //高精度对高精度效率高.
                              //大数对低精度的效率低
  bign t;
  t = *this;
  while(t >= b)
   t = t - b;
  return t;
 }

 int mod(const int m)  //高精度对小精度求mod
 {
  int ans = 0;
  for(int i = len-1; i >= 0; --i)
   ans = (int)( (ans*10+s[i]) % m);
  return ans;
 }
};

istream & operator>> (istream &in,bign &x)
{
 string s;
 in >> s;
 x = s.c_str();
 return in;
}

ostream & operator<< (ostream &out,const bign &x)
{
 out << x.str();
 return out;
}

 

int main()
{
    bign a,b;
    bign c;
    cout << (bign)10 + (bign)2 << endl;
    while(cin >> a >> b)
       
        cout << a.pow(b) << " " << (a.pow(b)).len << endl;
        cout << a+b << " " << (a+b).len << endl;
        cout << a-b << " " << (a-b).len << endl;
        cout << a*b << " " << (a*b).len << endl;
        cout << a/b << " " << (a/b).len << endl;
        cout << a%b << " " << (a%b).len << endl;
        a = b = c;
    }
    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值