高精 by jzzcjb
生活随笔
收集整理的這篇文章主要介紹了
高精 by jzzcjb
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
每個OIER都應該有一個屬于自己的高精模板
——沃茲·基·碩德華
高精板子
支持 min,max,判==,比較大小,正數減負數,負數減正數,負數加正數,負數乘正數,高精除低精(含正負),int 轉高精,高精讀入輸出(含正負)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct bign{
int len;
int num[15010];
bool flag;
bign(){len=1;flag=0;memset(num,0,sizeof num);}
bign(int x){
len=0;flag=(x<0);x=(x<0)?-x:x;
while(x) num[++len]=x%10,x/=10;
}
void read(){
memset(num,0,sizeof(num));
char s[100001];cin>>s;len=strlen(s);
if(s[0]=='-'){flag=1;len--;
for(int i=1;i<=len;i++)
num[i]=s[len-i+1]-'0';
}
else{flag=0;
for(int i=1;i<=len;i++)
num[i]=s[len-i]-'0';
}
}
void write(){
if(flag&&num[len]!=0) cout<<"-";
for(int i=len;i>=1;i--) cout<<num[i];
}
};
void Swap(bign &a,bign &b){
bign c;
c=a;a=b;b=c;
}
bool operator < (bign a,bign b){
if(a.len!=b.len) return (a.len<b.len);
for(int i=a.len;i>=1;i--)
if(a.num[i]!=b.num[i]) return (a.num[i]<b.num[i]);
}
bool operator > (bign a,bign b){
return (a<b)?0:1;
}
bool operator == (bign a,bign b){
if(a.len!=b.len)return 0;
for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0;
return 1;
}
bign max(bign A,bign B){return (A>B)?A:B;}
bign operator - (bign a,bign b);
bign operator + (bign a,bign b){
bign ans;
if(a.flag&&b.flag) ans.flag=1;
if(a.flag&&!b.flag){b.flag=1;return a-b;}
if(!a.flag&&b.flag){a.flag=1;return b-a;}
int i=1,x=0;
while(i<=a.len||i<=b.len){
ans.num[i]+=x;ans.num[i]+=(a.num[i]+b.num[i]);
x=ans.num[i]/10;ans.num[i]%=10; i++;
}
ans.num[i]=x;
if(!ans.num[i])i--;
ans.len=i;
return ans;
}
bign operator - (bign a,bign b){
bign ans;
if(a.flag&&b.flag) ans.flag=1;
if(a.flag&&!b.flag){b.flag=1;return a+b;}
if(!a.flag&&b.flag){a.flag=0;return a+b;}
if(a==b)return ans;
if(a<b) Swap(a,b),ans.flag^=1;
for(int i=1;i<=a.len;i++){
if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;
ans.num[i]=a.num[i]-b.num[i];
if(ans.num[i]<0){
ans.num[i]+=10; a.num[i+1]--;
}
}
int len=max(a.len,b.len);
while(ans.num[len]<=0&&len>1)len--;
ans.len=len;
return ans;
}
bign operator * (bign a,bign b){
bign ans;
ans.flag=a.flag^b.flag;
int len=a.len+b.len;
for(int i=1;i<=a.len;i++){
int x=0;
for(int j=1;j<=b.len;j++){
ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
x=ans.num[i+j-1]/10;
ans.num[i+j-1]%=10;
}
ans.num[i+b.len]+=x;
}
while(!ans.num[len] && len>1)len--;
ans.len=len;
return ans;
}
bign operator /(bign a,int b){
bign ans;
ans.flag=a.flag^(b<0);
b=b<0?-b:b;
int len=a.len;
for(int i=len,x=0;i>=1;i--){
x=x*10+a.num[i];
ans.num[i]=x/b;
x%=b;
}
while(!ans.num[len]&&len>1) len--;
ans.len=len;
return ans;
}
int main(){
A.read();B.read();
B.write();
}
經過總計超過24小時的調試和發瘋,請放心食用
總結
以上是生活随笔為你收集整理的高精 by jzzcjb的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中send函数MSG_NOSI
- 下一篇: .NET Framework 4.5 五