自己写的好挫的大数。。。。
发布时间:2020-12-14 03:56:56 所属栏目:大数据 来源:网络整理
导读:#includecstdio#includeiostream#includecstring#includecstdlib#includecmath#includealgorithm#define LL long long#define s2 (sqrt(2))using namespace std;struct big_int{ int v[1000]; int len; big_int() { memset(v,sizeof(v)); len=0; } void mem(
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #define LL long long #define s2 (sqrt(2)) using namespace std; struct big_int { int v[1000]; int len; big_int() { memset(v,sizeof(v)); len=0; } void mem(int b) { if(b<0) exit(-1); len=0; while(b) { v[len++]=b%10; b/=10; } } void mem(const char *s) { len=0; int ls=strlen(s); while(ls>0 && s[0]=='0') { ls--; s++; } while(len<ls) { v[len]=s[ls-len-1]-'0'; if(v[len]<0 || v[len]>9) exit(-2); len++; } } void print(const char *c="",const char *s="") { printf("%s",c); if(len==0) { printf("0%s",s); return; } for(int i=len-1;i>=0;i--) { printf("%d",v[i]); } printf("%s",s); } }; big_int operator+(big_int a,big_int b) { big_int ans; int c=0,la=0,lb=0; while(la<a.len && lb<b.len) { c=a.v[la]+b.v[lb]+c; ans.v[ans.len++]=c%10; c=c/10; la++;lb++; } while(la<a.len) { c=a.v[la]+c; ans.v[ans.len++]=c%10; c=c/10; la++; } while(lb<b.len) { c=b.v[lb]+c; ans.v[ans.len++]=c%10; c=c/10; lb++; } while(c) { ans.v[ans.len++]=c%10; c=c/10; } return ans; } big_int exp(int a,int n) { big_int ans; ans.len=n+1; ans.v[n]=a; return ans; } big_int exp(big_int a,int n) { big_int ans; ans.len=max(0,a.len+n); memcpy(ans.v+n,a.v,a.len*sizeof(int)); return ans; } big_int operator*(big_int a,int b) { big_int ans; if(a.len==0 || b==0) { ans.mem(0); return ans; } int c=0,lb=0; while(la<a.len || c>0) { c=a.v[la]*b+c; ans.v[ans.len++]=c%10; c=c/10; la++; } return ans; } big_int operator*(int a,big_int b) { return b*a; } big_int operator*(big_int a,big_int b) { big_int ans; if(a.len==0 || b.len==0) { return ans; } int len; for(len=0;len<b.len;len++) { ans=ans+exp(a*b.v[len],len); } return ans; } big_int operator^(big_int a,int b) { big_int ans,t=a; ans.mem(1); while(b) { if(b&1) ans=ans*t; t=t*t; b>>=1; } return ans; } big_int operator^(big_int a,big_int b) { big_int ans,t=a; ans.mem(1); while(b.len) { ans=ans*(t^b.v[0]); t=t^10; b=exp(b,-1); } return ans; } int main() { return 0; } 后来又写了一个好一点的: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> using namespace std; typedef long long LL; const LL M=1000000000LL; const int maxlen=3; class bint { public: int len; LL a[maxlen]; bint(LL x); void print(char *); void println(); bint left_move(int); bint operator+(bint); bint operator*(bint); bint operator*(LL); bint operator/(LL); }; /**********************************/ bint::bint(LL x=0) { len=0; //memset(a,sizeof(a)); while(x) { len++; a[len-1]=x%M; x/=M; } } /* 2 1000000000000 Case 1: 177532966574642659861022 */ void bint::print(char *s="") { //printf("len=%dn",len); if(len==0) { printf("0%s",s); return; } printf("%I64d",a[len-1]); for(int i=len-2;i>=0;i--) printf("%09I64d",a[i]); printf("%s",s); } void bint::println(){print("n");} bint bint::left_move(int t=1) { if(len==0 || t<=0) return *this; len+=t; //if(len>=maxlen) exit(-1); for(int i=len-1;i>=t;i--) a[i]=a[i-t]; for(int i=t-1;i>=0;i--) a[i]=0; return *this; } bint bint::operator+(bint t) { bint ans=t; LL c=0; LL alen=max(len,ans.len); for(int i=0;i<alen;i++) { //ans.println(); if(ans.len<=i) { ans.len++; ans.a[i]=0; } if(len<=i) ans.a[i]+=c; else ans.a[i]+=a[i]+c; c=ans.a[i]/M; if(c) ans.a[i]%=M; } if(c) { ans.len++; ans.a[ans.len-1]=c; } return ans; } bint bint::operator*(LL t) { if(t>=M) return (*this) * bint(t); bint ans=*this; LL c=0; for(int i=0;i<len;i++) { ans.a[i]*=t; ans.a[i]+=c; c=ans.a[i]/M; if(c) ans.a[i]%=M; //ans.println(); } if(c) { ans.len++; ans.a[ans.len-1]=c; } return ans; } bint bint::operator*(bint t) { bint ans(0); for(int i=0;i<len;i++) { ans=ans+(t*a[i]).left_move(i); //ans.println(); } return ans; } bint bint::operator/(LL t) { bint ans=*this; LL r=0; for(int i=len-1;i>=0;i--) { ans.a[i]=(a[i]+r*M)/t; r=(a[i]+r*M)%t; //ans.println(); } if(ans.a[len-1]==0) ans.len--; return ans; } /**********************************/ int main() { int T; int cas=1; scanf("%Id",&T); while(T--) { LL n,m,i,j; bint ans(0); LL a,b; scanf("%I64d",&n); m=sqrt(n+0.5); for(i=1;i<=m;i++) { a=n/i; b=n/(i+1)+1; ans=ans+bint(a-b+1)*(n%a+n%b); } ans=ans/2; for(i=2;i<b;i++) ans=ans+bint(n%i); printf("Case %d: ",cas++); ans.println(); //printf("%I64dn",bl(n)); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |