高精度codevs 3115-3118

来源:互联网 发布:手机 usb 共享网络 编辑:程序博客网 时间:2024/06/14 16:46

模板,想改压位来,可以压位后除法慢。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
long long tmp[1100];
const int base=10; 
const int wlen=1;
struct bigNumber{//大整数
   int len;
   long long num[1010];
   bigNumber(){len=1;memset(num,0,sizeof(num));   }
   void print(){
    printf("%lld",num[len]);
    for(int i=len-1;i>=1;i--)
        printf("%lld",num[i]);
    printf("\n");
}
    bool operator >(const bigNumber T)const{//重载> 
       if(len!=T.len)return len>T.len;
       for(int i=len;i>=1;i--) 
           if(num[i]!=T.num[i])return num[i]>T.num[i];       
       return false;
   }
    bool operator ==(const bigNumber T)const{//重载== 
       if(len!=T.len)return false;
       for(int i=len;i>=1;i--)
           if(num[i]!=T.num[i])return false;
       return true;
   }
   bigNumber operator +(const bigNumber B)const{//载+ 
    bigNumber C;
    C.len=max(len,B.len);
    for(int i=1;i<=C.len;i++){

        C.num[i]+=num[i]+B.num[i];
        C.num[i+1]+=C.num[i]/base;
        C.num[i]%=base;
    }
    while(C.num[C.len+1]){
        C.len++;
        C.num[C.len+1]+=C.num[C.len]/base;
        C.num[C.len]%=base;
    }
    return C;
}
bigNumber operator *(long long B){//重载*高精度*单精度 
    bigNumber C;
    C.len=len;
    for(int i=1;i<=len;i++){
        C.num[i]+=num[i]*B;
        C.num[i+1]+=C.num[i]/base;
        C.num[i]%=base;
    }
    while(C.num[C.len+1]){
        C.len++;
        C.num[C.len+1]+=C.num[C.len]/base;
        C.num[C.len]%=base;
    }
    return C;
}
   
}a;


bigNumber operator -( bigNumber A, bigNumber B){//载- 
    bigNumber C;
    if(!(A>B)){
    C=A;A=B;B=C;
    printf("-");
}
memset(C.num,0,sizeof(C.num));
    C.len=A.len;
    for(int i=1;i<=C.len;i++){
        C.num[i]=A.num[i]-B.num[i];
        if(C.num[i]<0){
C.num[i]+=base;
        A.num[i+1]--;
}
    }
    while(C.num[C.len]==0)C.len--;
    return C;
}


bigNumber operator *(const bigNumber A,const bigNumber B){//重载*
    bigNumber C;
    memset(C.num,0,sizeof(C.num));
    C.len=A.len+B.len-1;
    for(int i=1;i<=A.len;i++)
        for(int j=1;j<=B.len;j++){
            C.num[i+j-1]+=A.num[i]*B.num[j];
        C.num[i+j]+=C.num[i+j-1]/base;
        C.num[i+j-1]%=base;
    }
    while(C.num[C.len+1]){
        C.len++;
        C.num[C.len+1]+=C.num[C.len]/base;
        C.num[C.len]%=base;
    }
    return C;
}


bigNumber operator /(const bigNumber A,const long long B){//高精度/单精度 
    long long T=0ll;
    bigNumber C;
    memset(C.num,0ll,sizeof(C.num));
    C.len=A.len;
     for(int i=A.len;i>=1;i--){    
        T=(T*base+A.num[i]);
C.num[i]=T/B;
T=T%B;
}
while(C.len>1&&C.num[C.len]==0)C.len--;   
    return C;
}
inline bigNumber operator /( bigNumber A,const bigNumber B){//高精度/高精度

bigNumber C,D;
C.len=A.len;
D.len=1;
for(int i=A.len;i>0;i--){
D=D*10;
D.num[1] =A.num[i];
while(!(B>D)){
D=D-B;
C.num[i]++;
}
}
while(C.len>1&&C.num[C.len]==0)C.len--;   
return C; 
}




inline void scan(bigNumber& T){
    memset(T.num,0,sizeof(T.num));
    char s[1010];
    scanf("%s",s);
    int tmp,ls;
    ls=strlen(s);
    T.len=ls;
    for(int i=1;i<=T.len;i++){
    T.num[i]=s[ls-i]-'0';
    
}
    
}




int main()
{ freopen("out.txt","w",stdout);
  int alen,al,ar,ahead;
  
  bigNumber a,b,c;  
  scan(a);
  scan(b); 
  //(a+b).print();
  //(a-b).print();
  //(a*b).print();
  (a/b).print();
  
 return 0;
}

压位参数:

const int base=10000; 
const int wlen=4;

压位后的读入:

inline void scan(bigNumber& T){
    memset(T.num,0,sizeof(T.num));
    char s[1010];
    scanf("%s",s)   ;
    int tmp,ls;
    ls=strlen(s)-1;
    T.len=ls/wlen+1;
    for(int i=1;i<=T.len;i++){
    int ed=ls-(i-1)*wlen;
    int st=max(0,ed-wlen+1);
    tmp=0;
    for(int j=st;j<=ed;j++)
    tmp=tmp*10+s[j]-'0';
    T.num[i]=tmp; 
}
    
}

压位后的输出

void print(){
    printf("%lld",num[len]);
    for(int i=len-1;i>=1;i--)
        printf("%04lld",num[i]);
    printf("\n");
}

0 0
原创粉丝点击