整理了一下高精度,虽然可用java,但很多时候还是C++写的方便。

附上kuangbin神的高精度模板(HDU1134 求卡特兰数)

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <algorithm>
  4. #include <string.h>
  5. using namespace std;
  6. /*
  7. * 完全大数模板
  8. * 输出cin>>a
  9. * 输出a.print();
  10. * 注意这个输入不能自动去掉前导0的,可以先读入到char数组,去掉前导0,再用构造函数。
  11. */
  12. #define MAXN 9999
  13. #define MAXSIZE 1010
  14. #define DLEN 4
  15. class BigNum
  16. {
  17. private:
  18. int a[]; //可以控制大数的位数
  19. int len;
  20. public:
  21. BigNum(){len=;memset(a,,sizeof(a));} //构造函数
  22. BigNum(const int); //将一个int类型的变量转化成大数
  23. BigNum(const char*); //将一个字符串类型的变量转化为大数
  24. BigNum(const BigNum &); //拷贝构造函数
  25. BigNum &operator=(const BigNum &); //重载赋值运算符,大数之间进行赋值运算
  26. friend istream& operator>>(istream&,BigNum&); //重载输入运算符
  27. friend ostream& operator<<(ostream&,BigNum&); //重载输出运算符
  28. BigNum operator+(const BigNum &)const; //重载加法运算符,两个大数之间的相加运算
  29. BigNum operator-(const BigNum &)const; //重载减法运算符,两个大数之间的相减运算
  30. BigNum operator*(const BigNum &)const; //重载乘法运算符,两个大数之间的相乘运算
  31. BigNum operator/(const int &)const; //重载除法运算符,大数对一个整数进行相除运算
  32. BigNum operator^(const int &)const; //大数的n次方运算
  33. int operator%(const int &)const; //大数对一个int类型的变量进行取模运算
  34. bool operator>(const BigNum &T)const; //大数和另一个大数的大小比较
  35. bool operator>(const int &t)const; //大数和一个int类型的变量的大小比较
  36. void print(); //输出大数
  37. };
  38. BigNum::BigNum(const int b) //将一个int类型的变量转化为大数
  39. {
  40. int c,d=b;
  41. len=;
  42. memset(a,,sizeof(a));
  43. while(d>MAXN)
  44. {
  45. c=d-(d/(MAXN+))*(MAXN+);
  46. d=d/(MAXN+);
  47. a[len++]=c;
  48. }
  49. a[len++]=d;
  50. }
  51. BigNum::BigNum(const char *s) //将一个字符串类型的变量转化为大数
  52. {
  53. int t,k,index,L,i;
  54. memset(a,,sizeof(a));
  55. L=strlen(s);
  56. len=L/DLEN;
  57. if(L%DLEN)len++;
  58. index=;
  59. for(i=L-;i>=;i-=DLEN)
  60. {
  61. t=;
  62. k=i-DLEN+;
  63. if(k<)k=;
  64. for(int j=k;j<=i;j++)
  65. t=t*+s[j]-'';
  66. a[index++]=t;
  67. }
  68. }
  69. BigNum::BigNum(const BigNum &T):len(T.len) //拷贝构造函数
  70. {
  71. int i;
  72. memset(a,,sizeof(a));
  73. for(i=;i<len;i++)
  74. a[i]=T.a[i];
  75. }
  76. BigNum & BigNum::operator=(const BigNum &n) //重载赋值运算符,大数之间赋值运算
  77. {
  78. int i;
  79. len=n.len;
  80. memset(a,,sizeof(a));
  81. for(i=;i<len;i++)
  82. a[i]=n.a[i];
  83. return *this;
  84. }
  85. istream& operator>>(istream &in,BigNum &b)
  86. {
  87. char ch[MAXSIZE*];
  88. int i=-;
  89. in>>ch;
  90. int L=strlen(ch);
  91. int count=,sum=;
  92. for(i=L-;i>=;)
  93. {
  94. sum=;
  95. int t=;
  96. for(int j=;j<&&i>=;j++,i--,t*=)
  97. {
  98. sum+=(ch[i]-'')*t;
  99. }
  100. b.a[count]=sum;
  101. count++;
  102. }
  103. b.len=count++;
  104. return in;
  105. }
  106. ostream& operator<<(ostream& out,BigNum& b) //重载输出运算符
  107. {
  108. int i;
  109. cout<<b.a[b.len-];
  110. for(i=b.len-;i>=;i--)
  111. {
  112. printf("%04d",b.a[i]);
  113. }
  114. return out;
  115. }
  116. BigNum BigNum::operator+(const BigNum &T)const //两个大数之间的相加运算
  117. {
  118. BigNum t(*this);
  119. int i,big;
  120. big=T.len>len?T.len:len;
  121. for(i=;i<big;i++)
  122. {
  123. t.a[i]+=T.a[i];
  124. if(t.a[i]>MAXN)
  125. {
  126. t.a[i+]++;
  127. t.a[i]-=MAXN+;
  128. }
  129. }
  130. if(t.a[big]!=)
  131. t.len=big+;
  132. else t.len=big;
  133. return t;
  134. }
  135. BigNum BigNum::operator-(const BigNum &T)const //两个大数之间的相减运算
  136. {
  137. int i,j,big;
  138. bool flag;
  139. BigNum t1,t2;
  140. if(*this>T)
  141. {
  142. t1=*this;
  143. t2=T;
  144. flag=;
  145. }
  146. else
  147. {
  148. t1=T;
  149. t2=*this;
  150. flag=;
  151. }
  152. big=t1.len;
  153. for(i=;i<big;i++)
  154. {
  155. if(t1.a[i]<t2.a[i])
  156. {
  157. j=i+;
  158. while(t1.a[j]==)
  159. j++;
  160. t1.a[j--]--;
  161. while(j>i)
  162. t1.a[j--]+=MAXN;
  163. t1.a[i]+=MAXN+-t2.a[i];
  164. }
  165. else t1.a[i]-=t2.a[i];
  166. }
  167. t1.len=big;
  168. while(t1.a[len-]== && t1.len>)
  169. {
  170. t1.len--;
  171. big--;
  172. }
  173. if(flag)
  174. t1.a[big-]=-t1.a[big-];
  175. return t1;
  176. }
  177. BigNum BigNum::operator*(const BigNum &T)const //两个大数之间的相乘
  178. {
  179. BigNum ret;
  180. int i,j,up;
  181. int temp,temp1;
  182. for(i=;i<len;i++)
  183. {
  184. up=;
  185. for(j=;j<T.len;j++)
  186. {
  187. temp=a[i]*T.a[j]+ret.a[i+j]+up;
  188. if(temp>MAXN)
  189. {
  190. temp1=temp-temp/(MAXN+)*(MAXN+);
  191. up=temp/(MAXN+);
  192. ret.a[i+j]=temp1;
  193. }
  194. else
  195. {
  196. up=;
  197. ret.a[i+j]=temp;
  198. }
  199. }
  200. if(up!=)
  201. ret.a[i+j]=up;
  202. }
  203. ret.len=i+j;
  204. while(ret.a[ret.len-]== && ret.len>)ret.len--;
  205. return ret;
  206. }
  207. BigNum BigNum::operator/(const int &b)const //大数对一个整数进行相除运算
  208. {
  209. BigNum ret;
  210. int i,down=;
  211. for(i=len-;i>=;i--)
  212. {
  213. ret.a[i]=(a[i]+down*(MAXN+))/b;
  214. down=a[i]+down*(MAXN+)-ret.a[i]*b;
  215. }
  216. ret.len=len;
  217. while(ret.a[ret.len-]== && ret.len>)
  218. ret.len--;
  219. return ret;
  220. }
  221. int BigNum::operator%(const int &b)const //大数对一个 int类型的变量进行取模
  222. {
  223. int i,d=;
  224. for(i=len-;i>=;i--)
  225. d=((d*(MAXN+))%b+a[i])%b;
  226. return d;
  227. }
  228. BigNum BigNum::operator^(const int &n)const //大数的n次方运算
  229. {
  230. BigNum t,ret();
  231. int i;
  232. if(n<)exit(-);
  233. if(n==)return ;
  234. if(n==)return *this;
  235. int m=n;
  236. while(m>)
  237. {
  238. t=*this;
  239. for(i=;(i<<)<=m;i<<=)
  240. t=t*t;
  241. m-=i;
  242. ret=ret*t;
  243. if(m==)ret=ret*(*this);
  244. }
  245. return ret;
  246. }
  247. bool BigNum::operator>(const BigNum &T)const //大数和另一个大数的大小比较
  248. {
  249. int ln;
  250. if(len>T.len)return true;
  251. else if(len==T.len)
  252. {
  253. ln=len-;
  254. while(a[ln]==T.a[ln]&&ln>=)
  255. ln--;
  256. if(ln>= && a[ln]>T.a[ln])
  257. return true;
  258. else
  259. return false;
  260. }
  261. else
  262. return false;
  263. }
  264. bool BigNum::operator>(const int &t)const //大数和一个int类型的变量的大小比较
  265. {
  266. BigNum b(t);
  267. return *this>b;
  268. }
  269. void BigNum::print() //输出大数
  270. {
  271. int i;
  272. printf("%d",a[len-]);
  273. for(i=len-;i>=;i--)
  274. printf("%04d",a[i]);
  275. printf("\n");
  276. }
  277. BigNum f[];//卡特兰数
  278. int main()
  279. {
  280. f[]=;
  281. for(int i=;i<=;i++)
  282. f[i]=f[i-]*(*i-)/(i+);//卡特兰数递推式
  283. int n;
  284. while(scanf("%d",&n)==)
  285. {
  286. if(n==-)break;
  287. f[n].print();
  288. }
  289. return ;
  290. }

C++高精度的更多相关文章

  1. CSharpGL(28)得到高精度可定制字形贴图的极简方法

    CSharpGL(28)得到高精度可定制字形贴图的极简方法 回顾 以前我用SharpFont实现了解析TTF文件从而获取字形贴图的功能,并最终实现了用OpenGL渲染文字. 使用SharpFont,美 ...

  2. 递推+高精度 UVA 10497 Sweet Child Makes Trouble(可爱的孩子惹麻烦)

    题目链接 题意: n个物品全部乱序排列(都不在原来的位置)的方案数. 思路: dp[i]表示i个物品都乱序排序的方案数,所以状态转移方程.考虑i-1个物品乱序,放入第i个物品一定要和i-1个的其中一个 ...

  3. [Template]高精度模板

    重新写一下高精度模板(不要问我为什么) 自认为代码风格比较漂亮(雾 如果有更好的写法欢迎赐教 封装结构体big B是压位用的进制,W是每位长度 size表示长度,d[]就是保存的数字,倒着保存,从1开 ...

  4. Code[VS] 3123 高精度练习之超大整数乘法

    FFT 做 高精度乘法 #include <bits/stdc++.h> ); struct complex { double a, b; inline complex( , ) { a ...

  5. Java 高精度数字

    BigInteger // 高精度整数 BigDecimal //高精度小数  小数位数不受限制

  6. c++减法高精度算法

    c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过0.02秒),但是很好理解,很适合新手 高精算法的 ...

  7. c++加法高精度算法

    c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就 ...

  8. [转]使用Stopwatch类实现高精度计时

    对一段代码计时同查通常有三种方法.最简单就是用DateTime.Now来进行比较了,不过其精度只有3.3毫秒,可以通过DllImport导入QueryPerformanceFrequency和Quer ...

  9. .net平台下获取高精度时间类

    原文:http://www.it118.org/specials/321869dd-98cb-431b-b6d2-82d973cd739d/d940a15c-0d36-4369-8de0-b07cf3 ...

  10. [vijos P1040] 高精度乘法

    如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了, ...

随机推荐

  1. python3 安装win32clipboard 和 win32con 报No matching distribution found for win32con错误

    win32con.win32clipboad不能用pip install 安装,也不能够查找到这个包,原来,这个是pypiwin32的一部分,直接安装pypiwin32就可以了 pip install ...

  2. 5、shader混合(Blending)、雾

    直接上效果图:queue:transparent 雾: fog { mode exp color(0.6,0.4,0.3,0.8) density 0.3 range ,0.8 } 效果: http: ...

  3. 可以随着SeekBar滑块滑动显示的Demo

    //关于Seek的自定义样式,之前也有总结过,但是,一直做不出随着滑块移动的效果,查询了很多资料终于解决了这个问题,现在把代码写出来有bug的地方 希望大家批评指正. Step 1 :自定义一个Vie ...

  4. (转载)Linux进程间通信

    (在学习linux进程通信,看到一篇很好的文章,转载过来,原文地址是http://www.cnblogs.com/linshui91/archive/2010/09/29/1838770.html) ...

  5. 【转】H5 - HTML5新增标签

    下面分别是传统的div+css的页面布局方式 下面是HTML5布局方式: 是不是精简了很多呢  现在来说说图片中出现的标签: 结构标签:(块状元素) 有意义的div artical 标记定义一篇文章  ...

  6. Hadoop执行bin/stop-all.sh时no namenode to stop异常

    1 先关闭hadoop所有服务 命令: bin/stop-all.sh 2 格式化namenode 命令: bin/hadoop namenode -format 3 重新启动所有服务 命令: bin ...

  7. eclipse安装问题

    eclipse安装之前需要安装JDK. 注意:eclipse和JDK需要一致,如都是64位或者都是32位. 不然会报错.

  8. phpquery中文手册

    [简介] phpQuery是一个基于PHP的服务端开源项目,它可以让PHP开发人员轻松处理DOM文档内容.更有意思的是,它采用了jQuery的思想,使得可以像使用jQuery一样处理页面内容,获取想要 ...

  9. Aspose.Pdf合并PDF文件

    使用Aspose.Pdf类库,有很多种方法可以合并PDF文件,这里简单介绍小生见到的几种: Doucment.Pages.Add PdfFileEditor.Append PdfFileEditor. ...

  10. 玩转VFS(sys_open, overlayfs, rename)

    带着问题学习dentry 1)文件删除时 dentry的结构是如何变化的?是直接设置无效的吗?如果此时正好有个访问是在要删除目录下的一个文件,这咋办呢? 2)内核document目录下级联式地使用 d ...