【高精度运算】
2011-08-18 21:23
267 查看
虽说高精度直接考查的越来越少,不过还是以防万一。
#define maxlen 1000 struct 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; }
相关文章推荐
- 高精度运算之加法
- 高精度加法以及乘法运算
- Train Problem II(卡特兰数以及高精度运算)
- 高精度运算
- 高精度运算总结
- 高精度运算(c程序)
- 1020. Big Integer(高精度运算)
- poj 1001 Exponentiation(高精度运算)
- 高精度运算之小学生算法
- 算法学习笔记(三)问题的转化与高精度运算
- 高精度运算专题2-减法运算(The subtraction operation)
- 【演武厅】高精度四则运算实战
- (高精度运算4.7.21)UVA 10106 Product(大数乘法)
- (高精度运算4.7.24)UVA 10013 Super long sums(大数加法——某一位的数字可能大于10)
- java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定
- 高精度的大数字运算
- bign类-高精度运算类
- 高精度运算——实数乘法
- 高精度运算-465 Overflow