自己写的好挫的大数。。。。
来源:互联网 发布:js获取天气预报json 编辑:程序博客网 时间:2024/05/02 05:04
#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,0,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,la=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,0,sizeof(a)); while(x) { len++; a[len-1]=x%M; x/=M; }}/*21000000000000Case 1: 177532966574642659861022*/void bint::print(char *s=""){ //printf("len=%d\n",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("%I64d\n",bl(n)); } return 0;}
- 自己写的好挫的大数。。。。
- 自己写的大数相乘
- 怎样写好自己的程序代码
- 如何写好自己的博客
- 如何写好自己的Paper?
- 如何写好自己的简历
- 怎么样写好自己的博客文章
- 自己写的封装好的简单的AJAX--javascript
- java 调用自己写好的jar的方法
- 自己写一个好的PHP解析xml的类
- 第一次写自己的blog耶!好开心...
- 还是写点东西给自己的好
- 自己写一个可用并且好用的Sqlite工具
- 切图 移动端自己写好的按钮显示不一样
- 在IDEA中使用自己写好的Java代码
- 上传自己写的package到Pypi (简单好用)
- 想想还是用自己的博客写东西比较好
- 自己实现的大数类
- JsonObject和JsonArray的区别
- curl-loader 一个压力测试工具
- Anroid开发 之 音频文件的循环播放
- JAVA 抽象类与接口的区别
- mvc4 http错误403.14 forbidden
- 自己写的好挫的大数。。。。
- 第十一周项目3-5-判断一个数是否为素数
- SQL中的decode()函数
- java 时间格式化问题
- Lync Server 数据初始化
- 软件测试——白盒测试
- STL之vector的几种遍历方式
- 如何实现Postgresql数据库的重装与postgres密码重置
- 如何提高sql查询100万条数据count(*)汇总的速度