我要加入 登录
声振论坛 返回首页

wugang_88的个人空间 http://home.vibunion.com/?51003 [收藏] [复制] [分享] [RSS]

日志

标准大整数(vector).cpp

已有 358 次阅读2006-11-21 17:28

天气: 晴朗
心情: 高兴
#include<math.h>
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<vector>
#define LL_MAX 100
using namespace std;
class LLong
{
private:
 vector<long> a;
 int m;
 int cp;
private:
 int LL_BJ(const LLong &B);
 LLong Help_Add(const LLong &B);
 LLong Help_Sub(const LLong &B);
 void LL_Div01(const LLong &B,LLong &Q01,LLong &R01);
 void LL_Div02(const LLong &B,LLong &Q02,LLong &R02);
 void LL_Div03(const LLong &B,LLong &Q03,LLong &R03);
 void LL_Div(const LLong &B,LLong &Q,LLong &R);
public:
 LLong();
 LLong(char *s);
 LLong(long d);
 ~LLong()
 { ;  }
 void print();
 long get_a(int n);
 int get_m();
 int get_cp();
public:
 LLong operator+(const LLong &B);
 LLong operator-(const LLong &B);
 LLong operator*(const LLong &B);
 LLong operator^(const LLong &B);
 LLong operator%(const LLong &B);
 LLong operator/(const LLong &B);
 int operator==(const LLong &B);
 int operator!=(const LLong &B);
 int operator>(const LLong &B);
 int operator>=(const LLong &B){return(*this>B||*this==B);}
 int operator<(const LLong &B);
 int operator<=(const LLong &B){return(*this<B||*this==B);}
};
int main()
{
 LLong a("8848");
 LLong b("4494");
 a.print();
 cout<<endl;
 b.print();
 cout<<endl;
 (a+b).print();
 cout<<endl;
 ((LLong)8-b).print();
 cout<<endl;
 (a*b).print();
 cout<<endl;
 (a*5).print();
 cout<<endl;
 (a/b).print();
 cout<<endl;
 (a%b).print();
 cout<<endl;
 (a^b).print();
 cout<<endl;
 a.print();
 cout<<endl;
 b.print();
 cout<<endl;
 if(a!=b)
  cout<<"a!=b"<<endl;
 if(a>=b)
  cout<<"a>=b"<<endl;
 if(a<=b)
  cout<<"a<=b"<<endl;
 if(a<b)
  cout<<"a<b"<<endl;
 else if(a==b)
  cout<<"a==b"<<endl;
 else
  cout<<"a>b"<<endl;
 return 0;
}
LLong::LLong()
 {
  a.resize(LL_MAX);
  a[0]=0;
  m=0;
  cp=0;
 }
LLong::LLong(char *s)
{
 int n,i,t;
 a.resize(LL_MAX);
 if(*s=='-')
 {
  cp=1;
  n=-1;
 }
 else if(*s=='+')
 {
  cp=0;
  n=-1;
 }
 else
 {
  cp=0;
  n=0;
 }
 while(*s!='\0')
 {
  n++;
  s++;
 }
 if(n%4==0)
 {
  n=n/4;
  t=4;
 }
 else
 {
  t=n%4;
  n=n/4+1;
 }
 if(n==0)
  cout<<"Not have dat"<<endl;
 if(n>LL_MAX)
  a.resize(n);
 m=n-1;
 for(i=0;i<n-1;i++)
  a[i]=*(s-1-4*i)-48+(*(s-2-4*i)-48)*10+
   (*(s-3-4*i)-48)*100+(*(s-4-4*i)-48)*1000;
 a[n-1]=0;
 for(i=1;i<=t;i++)
  a[n-1]=a[n-1]+(*(s-i-4*(n-1))-48)*(int)pow(10,i-1);
}
LLong::LLong(long d)
{
 a.resize(LL_MAX);
 if(d<0)
  cp=1;
 else
  cp=0;
 d=abs(d);
 if(d<10000)
 {
  m=0;
  a[0]=d;
 }
 else if(d<100000000)
 {
  m=1;
  a[0]=d%10000;
  d=(d-d%10000)/10000;
  a[1]=d%10000;
 }
 else
 {
  m=2;
  a[0]=d%10000;
  d=(d-d%10000)/10000;
  a[1]=d%10000;
  d=(d-d%10000)/10000;
  a[2]=d%10000;
 }
}
void LLong::print()
{
 long i,b[4];
 char aa[4];
 if(cp==1)
  printf("-");
 printf("%ld",a[m]);
 for(i=m-1;i>=0;i--)
 {
  b[0]=a[i]%10;
  b[1]=((a[i]-b[0])/10)%10;
  b[2]=((a[i]-b[0]-b[1]*10)/100)%10;
  b[3]=((a[i]-b[0]-b[1]*10-b[2]*100)/1000)%10;
  aa[0]=b[0]+48;
  aa[1]=b[1]+48;
  aa[2]=b[2]+48;
  aa[3]=b[3]+48;
  printf("%c%c%c%c",aa[3],aa[2],aa[1],aa[0]);
 }
 
}
long LLong::get_a(int n)
{
 if((n>m)||(n<0))
 {
  cout<<"溢出"<<endl;
  return 0;
 }
 else
  return a[n];
}
int LLong::get_cp()
{
 return cp;
}
int LLong::get_m()
{
 return m;
}
int LLong::LL_BJ(const LLong &B)
{
 int i;
 if(m>B.m)
  return 1;
 else if(m<B.m)
  return -1;
 else
 {
  for(i=m;i>=0;i--)
  {
   if(a[i]>B.a[i])
    return 1;
   else if(a[i]<B.a[i])
    return -1;
  }
  return 0;
 }
}
int LLong::operator==(const LLong &B)
{
 if(cp!=B.cp)
  return 0;
 if(LL_BJ(B)==0)
  return 1;
 else
  return 0;
}
int LLong::operator!=(const LLong &B)
{
 if((LL_BJ(B)==0)&&(cp==B.cp))
  return 0;
 else
  return 1;
}
int LLong::operator<(const LLong &B)
{
 if(cp>B.cp)
  return 1;
 else if(cp<B.cp)
  return 0;
 else
 {
  if(((cp==0)&&(LL_BJ(B)==-1))||((cp==1)&&(LL_BJ(B)==1)))
   return 1;
  else
   return 0;
 }
 
}
int LLong::operator>(const LLong &B)
{
 if(cp>B.cp)
  return 0;
 else if(cp<B.cp)
  return 1;
 else
 {
  if(((cp==0)&&(LL_BJ(B)==1))||((cp==1)&&(LL_BJ(B)==-1)))
   return 1;
  else
   return 0;
 }
}
LLong LLong::Help_Add(const LLong &B)
{
 LLong D;
 int i;
 for(i=0;i<=m;i++)
 {
  if(i<=B.m)
  {
   if(i+2>LL_MAX)D.a.resize(i+2);
   D.a[i+1]=(D.a[i]+a[i]+B.a[i])/10000;
   D.a[i]=(D.a[i]+a[i]+B.a[i])%10000;
  }
  else
  {
   if(i+2>LL_MAX)D.a.resize(i+2);
   D.a[i+1]=(D.a[i]+a[i])/10000;
   D.a[i]=(D.a[i]+a[i])%10000;
  }
 }
 if(D.a[m+1]==0)
  D.m=m;
 else
  D.m=m+1;
 return D;
}
LLong LLong::Help_Sub(const LLong &B)
{
 LLong D;
 int i,y=0;
 for(i=0;i<=m;i++)
 {
  if(i<=B.m)
  {
   if(a[i]-y>=B.a[i])
   {  
 if(i+1>LL_MAX)D.a.resize(i+1);
    D.a[i]=a[i]-y-B.a[i];
    y=0;
   }
   else
   {  
 if(i+1>LL_MAX)D.a.resize(i+1);
    D.a[i]=10000+a[i]-y-B.a[i];
    y=1;
   }
  }
  else
  {
   if(a[i]-y>=0)
   {
 if(i+1>LL_MAX)D.a.resize(i+1);
    D.a[i]=a[i]-y;
    y=0;
   }
   else
   {
 if(i+1>LL_MAX)D.a.resize(i+1);
    D.a[i]=10000+a[i]-y;
    y=1;
   }
  }
 }
 for(i=m;i>=0;i--)
  if(D.a[i]!=0)
  {
   D.m=i;
   break;
  }
 return D;
}
LLong LLong::operator+(const LLong &B)
{
 LLong D,AA,BB=B;
 if(m+1>LL_MAX)AA.a.resize(m+1);
 for(int i=0;i<=m;i++)
  AA.a[i]=a[i];
 AA.m=m;
 AA.cp=cp;
 if((LL_BJ(BB)==1)||(LL_BJ(BB)==0))
 {
  if(cp==B.cp)
  {
   D=Help_Add(BB);
   D.cp=cp;
  }
  else if((cp==0)&&(B.cp==1))
  {
   D=Help_Sub(BB);
   D.cp=0;
  }
  else
  {
   D=Help_Sub(BB);
   D.cp=1;
  }
 }
 else
 {
  if(BB.m+1>LL_MAX)
 a.resize(BB.m+1);
  cp=BB.cp;m=BB.m;
  for(i=0;i<=BB.m;i++)
   a[i]=BB.a[i];
  BB=AA;
  if(cp==BB.cp)
  {
   D=Help_Add(BB);
   D.cp=cp;
  }
  else if((cp==0)&&(BB.cp==1))
  {
   D=Help_Sub(BB);
   D.cp=0;
  }
  else
  {
   D=Help_Sub(BB);
   D.cp=1;
  }
 }
 if(AA.m+1>LL_MAX)a.resize(AA.m+1);
 cp=AA.cp;
 m=AA.m;
 for(i=0;i<=AA.m;i++)
  a[i]=AA.a[i];
 return D;
}
LLong LLong::operator-(const LLong &B)
{
 LLong D,AA,BB=B;
 if(m+1>LL_MAX)AA.a.resize(m+1);
 for(int i=0;i<=m;i++)
  AA.a[i]=a[i];
 AA.m=m;
 AA.cp=cp;
 if((LL_BJ(BB)==1)||(LL_BJ(BB)==0))
 {
  if(cp==BB.cp)
  {
   D=Help_Sub(BB);
   D.cp=cp;
  }
  else if((cp==0)&&(BB.cp==1))
  {
   D=Help_Add(BB);
   D.cp=0;
  }
  else
  {
   D=Help_Add(BB);
   D.cp=1;
  }
 }
 else
 {
  if(BB.m+1>LL_MAX)
 a.resize(BB.m+1);
  cp=BB.cp;m=BB.m;
  for(i=0;i<=BB.m;i++)
   a[i]=BB.a[i];
  BB=AA;
  if(cp==BB.cp)
  {
   D=Help_Sub(BB);
   if(cp==1)
    D.cp=0;
   if(cp==0)
    D.cp=1;
  }
  else if((cp==0)&&(BB.cp==1))
  {
   D=Help_Add(BB);
   D.cp=1;
  }
  else
  {
   D=Help_Add(BB);
   D.cp=0;
  }
 }
 if(AA.m+1>LL_MAX)a.resize(AA.m+1);
 cp=AA.cp;
 m=AA.m;
 for(i=0;i<=m;i++)
  a[i]=AA.a[i];
 return D;
}
LLong LLong::operator*(const LLong &B)
{
 LLong F,D;
 int i,j,k;
 if(cp==B.cp)
  k=0;
 else
  k=1;
 LLong G=B;
 G.cp=0;
 for(j=0;j<=G.m;j++)
 {
  for(i=0;i<j+m+2;i++)/*sugaigua*/
  {
   if(i+1>LL_MAX)
    D.a.resize(i+1); 
   D.a[i]=0;
  }
  D.m=j+m+1;
  for(i=j;i<=j+m;i++)
  {
   D.a[i+1]=(D.a[i]+G.a[j]*a[i-j])/10000;
   D.a[i]=(D.a[i]+G.a[j]*a[i-j])%10000;
  }
  if(D.a[j+m+1]==0)
   D.m=j+m;
  D.cp=0;
  F=F+D;
 }
 F.cp=k;
 return F;
}
LLong LLong::operator^(const LLong &B)
{
 LLong AA,d,W,BB=B,T(1),D(1);
 if(BB<W)
 {
  cout<<"指数不能负"<<endl;
  return 1;
 }
 if(m+1>LL_MAX)AA.a.resize(m+1);
 AA.m=m;
 AA.cp=cp;
 for(int i=0;i<=m;i++)
  AA.a[i]=a[i];
 for(d=W;d<BB;d=d+T)
 {
  D=D*AA;
 }
 return D;
}
void LLong::LL_Div01(const LLong &B,LLong &Q,LLong &R)
{
 int i,n;
 LLong F,W,T(1);
 LLong AA,BB=B;
 if(m+1>LL_MAX)AA.a.resize(m+1);
 AA.m=m;
 AA.cp=cp;
 for(i=0;i<=m;i++)
  AA.a[i]=a[i];
 AA.cp=BB.cp=0;
 if(LL_BJ(BB)==-1)
 {
  R=AA;
  Q=W;
 }
 else if(LL_BJ(BB)==0)
 {
  R=W;
  Q=T;
 }
 else
 {
  n=AA.m-BB.m;
  for(i=0;i<n;i++)
  {
   if(i+1>LL_MAX)
    F.a.resize(i+1);
   F.a[i]=0;
  }
  if(AA.a[AA.m]>=BB.a[BB.m])
  {
   if(n+1>LL_MAX)F.a.resize(n+1);
   F.a[n]=AA.a[AA.m]/BB.a[BB.m];
   F.m=n;
  }
  else
  {
   F.a[n-1]=(AA.a[AA.m]*10000+AA.a[AA.m-1])/BB.a[BB.m];
   F.m=n-1;
  }
  F.cp=0;
  Q=F;
  R=AA-BB*F;
 }
}
void LLong::LL_Div02(const LLong &B,LLong &Q,LLong &R)
{
 LLong W,AA,BB=B;
 if(m+1>LL_MAX)AA.a.resize(m+1);
 AA.m=m;
 AA.cp=cp;
 for(int i=0;i<=m;i++)
  AA.a[i]=a[i];
 BB.cp=0;
 if(cp==0)
  LL_Div01(BB,Q,R);
 else
 {
  LL_Div01(BB,Q,R);
if(Q!=W)
   Q.cp=1;
if(R!=W)
  {
   if(R.cp==0)
    R.cp=1;
   else
    R.cp=0;
  }
 }
   if(AA.m+1>LL_MAX)a.resize(AA.m+1);
   cp=AA.cp;
   m=AA.m;
   for(i=0;i<=AA.m;i++)
    a[i]=AA.a[i];
   return;
}
void LLong::LL_Div03(const LLong &B,LLong &Q,LLong &R)
{
 LLong W,AAA,AA,QQ,RR,T(1),BB=B;
 if(m+1>LL_MAX)AA.a.resize(m+1);
 AA.m=m;
 AA.cp=cp;
 for(int i=0;i<=m;i++)
  AA.a[i]=a[i];
 AAA=AA;
 AA.cp=BB.cp=0;
 while(1)
 {
  LL_Div02(BB,QQ,RR);
  if(RR.m+1>LL_MAX)a.resize(RR.m+1);
  cp=RR.cp;
  m=RR.m;
  for(i=0;i<=RR.m;i++)
   a[i]=RR.a[i];
  if(LL_BJ(BB)==-1)
  {
   if(RR.cp==0)
   {
    R=RR;
    Q=Q+QQ;
   }
   else
   {
    R=BB+RR;
    Q=Q+QQ-T;
   }
   if(AAA.m+1>LL_MAX)a.resize(AAA.m+1);
   cp=AAA.cp;
   m=AAA.m;
   for(i=0;i<=AAA.m;i++)
    a[i]=AAA.a[i];
   return;
  }
   if(RR.m+1>LL_MAX)a.resize(RR.m+1);
   cp=RR.cp;
   m=RR.m;
   for(i=0;i<=RR.m;i++)
    a[i]=RR.a[i];
   Q=Q+QQ;
 
 }
}
void LLong::LL_Div(const LLong &B,LLong &Q,LLong &R)
{
 LLong W,AA,BB=B,AAA;
 if(m+1>LL_MAX)AA.a.resize(m+1);
 AA.m=m;
 AA.cp=cp;
 for(int i=0;i<=m;i++)
  AA.a[i]=a[i];
 AAA=AA;
if(BB==W)
 printf("Not to Div.");
 if((AA.cp==0)&&(BB.cp==0))
  LL_Div03(BB,Q,R);
 else if((AA.cp==1)&&(BB.cp==1))
 {
  cp=0;BB.cp=0;
  LL_Div03(BB,Q,R);
 }
 else if((AA.cp==1)&&(BB.cp==0))
 {
  cp=0;
  LL_Div03(BB,Q,R);
if(Q!=W)
  Q.cp=1;
if(R!=W)
   R.cp=1;
 }
 else
 {
  LL_Div03(BB,Q,R);
if(Q!=W)
   Q.cp=1;
 }
   if(AAA.m+1>LL_MAX)a.resize(AAA.m+1);
   cp=AAA.cp;
   m=AAA.m;
   for(i=0;i<=AAA.m;i++)
    a[i]=AAA.a[i];
   return;
}
LLong LLong::operator%(const LLong &B)
{
 LLong Q,R;
 LL_Div(B,Q,R);
 return R;
}
 
LLong LLong::operator/(const LLong &B)
{
 LLong Q,R;
 LL_Div(B,Q,R);
 return Q;
}

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 我要加入

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-14 13:55 , Processed in 0.031169 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部