【高精度运算】
来源:互联网 发布:莱纳德 知乎 编辑:程序博客网 时间:2024/04/29 21:34
虽说高精度直接考查的越来越少,不过还是以防万一。
#define maxlen 1000struct bint{ int len,s[maxlen]; bint(){len=1;memset(s,0,sizeof(s));} //*******本模板既可输入字符串,也可输入整数*******// bint(int t){ memset(s,0,sizeof(s));len=1; while(t){s[len++]=t%10;t/=10;} if(len>1)len--; } bint(char *str){ memset(s,0,sizeof(s));len=strlen(str); for(int i=1;i<=len;i++)s[i]=str[len-i]-'0'; } //print number friend void print(bint bi){ for(int i=bi.len;i>=1;i--)printf("%d",bi.s[i]); } //print number+enter friend void println(bint bi){ print(bi);printf("\n"); } //可作连=运算 bint operator=(int t){ len=1;if(t==0){s[1] = 0;return *this;} while(t){s[len++]=t%10;t/=10;} len--; return *this; } bint operator=(char *str){ len=strlen(str); for(int i=1;i<=len;i++)s[i]=str[len-i]-'0'; return *this; } friend int cmp(const bint &a,const bint &b){ //a>b返回正数,a==b返回0,a<b返回负数 if(a.len!=b.len)return a.len-b.len; for(int i=a.len;i>0;i--) if(a.s[i]!=b.s[i])return a.s[i]-b.s[i]; return 0; } //*******加法*******// bint operator+(const bint &bi){ int i; bint c; for(i=1;i<=len || i<=bi.len || c.s[i];i++){ c.s[i]+=s[i]+bi.s[i]; c.s[i+1]=c.s[i]/10;c.s[i]%=10; } if(i>1)c.len=i-1; return c; } //*******减法*******// bint operator-(const bint &bi){//只考虑a>=b,不考虑负数 int i,j; bint c; for(i=1,j=0;i<=len;i++){ c.s[i]=s[i]-j;if(i<=bi.len)c.s[i]-=bi.s[i]; if(c.s[i]<0){j=1;c.s[i]+=10;}else j=0; } c.len=len;while(c.len>1 && !c.s[c.len])c.len--; return c; } //*******乘法*******// bint operator*(const bint &bi){ int i,j;bint c;c.len=len+bi.len; for(i=1;i<=len;i++) for(j=1;j<=bi.len;j++)c.s[i+j-1]+=s[i]*bi.s[j]; for(i=1;i<c.len || c.s[i];i++){ c.s[i+1]+=c.s[i]/10;c.s[i]%=10; } while(i>1 && !c.s[i])i--;c.len=i; return c; } //*******除法*******// bint operator/(const bint &bi){ int i,j;bint d,c; for(i=len;i>0;i--){ if(!(d.len==1 && d.s[1]==0)){ for(j=d.len;j>0;j--)d.s[j+1]=d.s[j]; ++d.len; } d.s[1]=s[i]; while((j=cmp(d,bi))>=0){ d=d-bi;c.s[i]++; if(j==0)break; } } c.len=len; while(c.len>1 && c.s[c.len]==0)c.len--; return c; } //*******取余*******// bint operator%(const bint &bi){ int i,j;bint d; for(i=len;i>0;i--){ if(!(d.len==1 && d.s[1]==0)){ for(j=d.len;j>0;j--)d.s[j+1]=d.s[j]; ++d.len; } d.s[1]=s[i]; while((j=cmp(d,bi))>=0){d=d-bi;if(j==0)break;} } return d; } //*******次方*******// bint pow(int exp){ bint ret = 1, t = (*this); while (exp){ if (exp & 1) ret = ret * t; exp >>= 1; t = t * t; } return ret; }};bint a,b;int main(){ char s1[100],s2[100]; scanf("%s%s",s1,s2); a=bint(s1),b=bint(s2); println(a+b); println(a-b);//a>=b println(a*b); println(a/b); println(a.pow(3)); return 0;}
- 高精度运算
- 高精度运算
- 高精度运算
- 【高精度运算】
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算。
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算
- 高精度运算
- memset函数详细说明
- 菜鸟笔记之线性表定义
- 判断Android手机是否联网
- 「ことから」と「ことだから」
- 一步到位 快速获取HTC Desire Root权限
- 【高精度运算】
- 二分图匹配算法——匈牙利算法
- ZOJ 2504 Help John! 【最短路】 【Dijkstra】
- hadoop SequenceFile 写入例程注释
- Bullet 3D 物理引擎 简析(2)
- qqqqqqqqqqqqqqqqqqqqqq
- Bullet 物理引擎 简析[1]
- csdn的简历怎么投递啊?怎么没有搜索功能?
- poj 2663 Tri Tiling