C++高精度
整理了一下高精度,虽然可用java,但很多时候还是C++写的方便。
附上kuangbin神的高精度模板(HDU1134 求卡特兰数)
- #include <iostream>
- #include <stdio.h>
- #include <algorithm>
- #include <string.h>
- using namespace std;
- /*
- * 完全大数模板
- * 输出cin>>a
- * 输出a.print();
- * 注意这个输入不能自动去掉前导0的,可以先读入到char数组,去掉前导0,再用构造函数。
- */
- #define MAXN 9999
- #define MAXSIZE 1010
- #define DLEN 4
- class BigNum
- {
- private:
- int a[]; //可以控制大数的位数
- int len;
- public:
- BigNum(){len=;memset(a,,sizeof(a));} //构造函数
- BigNum(const int); //将一个int类型的变量转化成大数
- BigNum(const char*); //将一个字符串类型的变量转化为大数
- BigNum(const BigNum &); //拷贝构造函数
- BigNum &operator=(const BigNum &); //重载赋值运算符,大数之间进行赋值运算
- friend istream& operator>>(istream&,BigNum&); //重载输入运算符
- friend ostream& operator<<(ostream&,BigNum&); //重载输出运算符
- BigNum operator+(const BigNum &)const; //重载加法运算符,两个大数之间的相加运算
- BigNum operator-(const BigNum &)const; //重载减法运算符,两个大数之间的相减运算
- BigNum operator*(const BigNum &)const; //重载乘法运算符,两个大数之间的相乘运算
- BigNum operator/(const int &)const; //重载除法运算符,大数对一个整数进行相除运算
- BigNum operator^(const int &)const; //大数的n次方运算
- int operator%(const int &)const; //大数对一个int类型的变量进行取模运算
- bool operator>(const BigNum &T)const; //大数和另一个大数的大小比较
- bool operator>(const int &t)const; //大数和一个int类型的变量的大小比较
- void print(); //输出大数
- };
- BigNum::BigNum(const int b) //将一个int类型的变量转化为大数
- {
- int c,d=b;
- len=;
- memset(a,,sizeof(a));
- while(d>MAXN)
- {
- c=d-(d/(MAXN+))*(MAXN+);
- d=d/(MAXN+);
- a[len++]=c;
- }
- a[len++]=d;
- }
- BigNum::BigNum(const char *s) //将一个字符串类型的变量转化为大数
- {
- int t,k,index,L,i;
- memset(a,,sizeof(a));
- L=strlen(s);
- len=L/DLEN;
- if(L%DLEN)len++;
- index=;
- for(i=L-;i>=;i-=DLEN)
- {
- t=;
- k=i-DLEN+;
- if(k<)k=;
- for(int j=k;j<=i;j++)
- t=t*+s[j]-'';
- a[index++]=t;
- }
- }
- BigNum::BigNum(const BigNum &T):len(T.len) //拷贝构造函数
- {
- int i;
- memset(a,,sizeof(a));
- for(i=;i<len;i++)
- a[i]=T.a[i];
- }
- BigNum & BigNum::operator=(const BigNum &n) //重载赋值运算符,大数之间赋值运算
- {
- int i;
- len=n.len;
- memset(a,,sizeof(a));
- for(i=;i<len;i++)
- a[i]=n.a[i];
- return *this;
- }
- istream& operator>>(istream &in,BigNum &b)
- {
- char ch[MAXSIZE*];
- int i=-;
- in>>ch;
- int L=strlen(ch);
- int count=,sum=;
- for(i=L-;i>=;)
- {
- sum=;
- int t=;
- for(int j=;j<&&i>=;j++,i--,t*=)
- {
- sum+=(ch[i]-'')*t;
- }
- b.a[count]=sum;
- count++;
- }
- b.len=count++;
- return in;
- }
- ostream& operator<<(ostream& out,BigNum& b) //重载输出运算符
- {
- int i;
- cout<<b.a[b.len-];
- for(i=b.len-;i>=;i--)
- {
- printf("%04d",b.a[i]);
- }
- return out;
- }
- BigNum BigNum::operator+(const BigNum &T)const //两个大数之间的相加运算
- {
- BigNum t(*this);
- int i,big;
- big=T.len>len?T.len:len;
- for(i=;i<big;i++)
- {
- t.a[i]+=T.a[i];
- if(t.a[i]>MAXN)
- {
- t.a[i+]++;
- t.a[i]-=MAXN+;
- }
- }
- if(t.a[big]!=)
- t.len=big+;
- else t.len=big;
- return t;
- }
- BigNum BigNum::operator-(const BigNum &T)const //两个大数之间的相减运算
- {
- int i,j,big;
- bool flag;
- BigNum t1,t2;
- if(*this>T)
- {
- t1=*this;
- t2=T;
- flag=;
- }
- else
- {
- t1=T;
- t2=*this;
- flag=;
- }
- big=t1.len;
- for(i=;i<big;i++)
- {
- if(t1.a[i]<t2.a[i])
- {
- j=i+;
- while(t1.a[j]==)
- j++;
- t1.a[j--]--;
- while(j>i)
- t1.a[j--]+=MAXN;
- t1.a[i]+=MAXN+-t2.a[i];
- }
- else t1.a[i]-=t2.a[i];
- }
- t1.len=big;
- while(t1.a[len-]== && t1.len>)
- {
- t1.len--;
- big--;
- }
- if(flag)
- t1.a[big-]=-t1.a[big-];
- return t1;
- }
- BigNum BigNum::operator*(const BigNum &T)const //两个大数之间的相乘
- {
- BigNum ret;
- int i,j,up;
- int temp,temp1;
- for(i=;i<len;i++)
- {
- up=;
- for(j=;j<T.len;j++)
- {
- temp=a[i]*T.a[j]+ret.a[i+j]+up;
- if(temp>MAXN)
- {
- temp1=temp-temp/(MAXN+)*(MAXN+);
- up=temp/(MAXN+);
- ret.a[i+j]=temp1;
- }
- else
- {
- up=;
- ret.a[i+j]=temp;
- }
- }
- if(up!=)
- ret.a[i+j]=up;
- }
- ret.len=i+j;
- while(ret.a[ret.len-]== && ret.len>)ret.len--;
- return ret;
- }
- BigNum BigNum::operator/(const int &b)const //大数对一个整数进行相除运算
- {
- BigNum ret;
- int i,down=;
- for(i=len-;i>=;i--)
- {
- ret.a[i]=(a[i]+down*(MAXN+))/b;
- down=a[i]+down*(MAXN+)-ret.a[i]*b;
- }
- ret.len=len;
- while(ret.a[ret.len-]== && ret.len>)
- ret.len--;
- return ret;
- }
- int BigNum::operator%(const int &b)const //大数对一个 int类型的变量进行取模
- {
- int i,d=;
- for(i=len-;i>=;i--)
- d=((d*(MAXN+))%b+a[i])%b;
- return d;
- }
- BigNum BigNum::operator^(const int &n)const //大数的n次方运算
- {
- BigNum t,ret();
- int i;
- if(n<)exit(-);
- if(n==)return ;
- if(n==)return *this;
- int m=n;
- while(m>)
- {
- t=*this;
- for(i=;(i<<)<=m;i<<=)
- t=t*t;
- m-=i;
- ret=ret*t;
- if(m==)ret=ret*(*this);
- }
- return ret;
- }
- bool BigNum::operator>(const BigNum &T)const //大数和另一个大数的大小比较
- {
- int ln;
- if(len>T.len)return true;
- else if(len==T.len)
- {
- ln=len-;
- while(a[ln]==T.a[ln]&&ln>=)
- ln--;
- if(ln>= && a[ln]>T.a[ln])
- return true;
- else
- return false;
- }
- else
- return false;
- }
- bool BigNum::operator>(const int &t)const //大数和一个int类型的变量的大小比较
- {
- BigNum b(t);
- return *this>b;
- }
- void BigNum::print() //输出大数
- {
- int i;
- printf("%d",a[len-]);
- for(i=len-;i>=;i--)
- printf("%04d",a[i]);
- printf("\n");
- }
- BigNum f[];//卡特兰数
- int main()
- {
- f[]=;
- for(int i=;i<=;i++)
- f[i]=f[i-]*(*i-)/(i+);//卡特兰数递推式
- int n;
- while(scanf("%d",&n)==)
- {
- if(n==-)break;
- f[n].print();
- }
- return ;
- }
C++高精度的更多相关文章
- CSharpGL(28)得到高精度可定制字形贴图的极简方法
CSharpGL(28)得到高精度可定制字形贴图的极简方法 回顾 以前我用SharpFont实现了解析TTF文件从而获取字形贴图的功能,并最终实现了用OpenGL渲染文字. 使用SharpFont,美 ...
- 递推+高精度 UVA 10497 Sweet Child Makes Trouble(可爱的孩子惹麻烦)
题目链接 题意: n个物品全部乱序排列(都不在原来的位置)的方案数. 思路: dp[i]表示i个物品都乱序排序的方案数,所以状态转移方程.考虑i-1个物品乱序,放入第i个物品一定要和i-1个的其中一个 ...
- [Template]高精度模板
重新写一下高精度模板(不要问我为什么) 自认为代码风格比较漂亮(雾 如果有更好的写法欢迎赐教 封装结构体big B是压位用的进制,W是每位长度 size表示长度,d[]就是保存的数字,倒着保存,从1开 ...
- Code[VS] 3123 高精度练习之超大整数乘法
FFT 做 高精度乘法 #include <bits/stdc++.h> ); struct complex { double a, b; inline complex( , ) { a ...
- Java 高精度数字
BigInteger // 高精度整数 BigDecimal //高精度小数 小数位数不受限制
- c++减法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过0.02秒),但是很好理解,很适合新手 高精算法的 ...
- c++加法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就 ...
- [转]使用Stopwatch类实现高精度计时
对一段代码计时同查通常有三种方法.最简单就是用DateTime.Now来进行比较了,不过其精度只有3.3毫秒,可以通过DllImport导入QueryPerformanceFrequency和Quer ...
- .net平台下获取高精度时间类
原文:http://www.it118.org/specials/321869dd-98cb-431b-b6d2-82d973cd739d/d940a15c-0d36-4369-8de0-b07cf3 ...
- [vijos P1040] 高精度乘法
如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了, ...
随机推荐
- python3 安装win32clipboard 和 win32con 报No matching distribution found for win32con错误
win32con.win32clipboad不能用pip install 安装,也不能够查找到这个包,原来,这个是pypiwin32的一部分,直接安装pypiwin32就可以了 pip install ...
- 5、shader混合(Blending)、雾
直接上效果图:queue:transparent 雾: fog { mode exp color(0.6,0.4,0.3,0.8) density 0.3 range ,0.8 } 效果: http: ...
- 可以随着SeekBar滑块滑动显示的Demo
//关于Seek的自定义样式,之前也有总结过,但是,一直做不出随着滑块移动的效果,查询了很多资料终于解决了这个问题,现在把代码写出来有bug的地方 希望大家批评指正. Step 1 :自定义一个Vie ...
- (转载)Linux进程间通信
(在学习linux进程通信,看到一篇很好的文章,转载过来,原文地址是http://www.cnblogs.com/linshui91/archive/2010/09/29/1838770.html) ...
- 【转】H5 - HTML5新增标签
下面分别是传统的div+css的页面布局方式 下面是HTML5布局方式: 是不是精简了很多呢 现在来说说图片中出现的标签: 结构标签:(块状元素) 有意义的div artical 标记定义一篇文章 ...
- Hadoop执行bin/stop-all.sh时no namenode to stop异常
1 先关闭hadoop所有服务 命令: bin/stop-all.sh 2 格式化namenode 命令: bin/hadoop namenode -format 3 重新启动所有服务 命令: bin ...
- eclipse安装问题
eclipse安装之前需要安装JDK. 注意:eclipse和JDK需要一致,如都是64位或者都是32位. 不然会报错.
- phpquery中文手册
[简介] phpQuery是一个基于PHP的服务端开源项目,它可以让PHP开发人员轻松处理DOM文档内容.更有意思的是,它采用了jQuery的思想,使得可以像使用jQuery一样处理页面内容,获取想要 ...
- Aspose.Pdf合并PDF文件
使用Aspose.Pdf类库,有很多种方法可以合并PDF文件,这里简单介绍小生见到的几种: Doucment.Pages.Add PdfFileEditor.Append PdfFileEditor. ...
- 玩转VFS(sys_open, overlayfs, rename)
带着问题学习dentry 1)文件删除时 dentry的结构是如何变化的?是直接设置无效的吗?如果此时正好有个访问是在要删除目录下的一个文件,这咋办呢? 2)内核document目录下级联式地使用 d ...