从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西

其实这是刘汝佳老师在《算法竞赛 经典入门 第二版》 中所讲的模板,代码原封不动写上的,但是经过自己的使用与调试也明白了其中的内涵。

首先定义大数的结构体:

  1. struct BigNum{
  2. static const int BASE=;
  3. static const int WIDTH=;
  4. vector<int> s;
  5. BigNum(long long num=){ *this=num; }
  6. BigNum operator = (long long num){
  7. s.clear(); //vector.clear() 移除容器中的元素
  8. do{
  9. s.push_back(num%BASE); //vectro.push_back() 向尾部添加元素
  10. num/=BASE;
  11. }while(num>);
  12. return *this;
  13. }
  14. BigNum operator =(const string& str){
  15. s.clear();
  16. int x,len=(str.length()-)/WIDTH+;
  17. int mmm=str.length();
  18. for(int i=;i<len;i++){
  19. int end=str.length()-i*WIDTH;
  20. int start=max(,end-WIDTH);
  21. sscanf(str.substr(start,end-start).c_str(),"%d",&x);
  22. s.push_back(x);
  23. /*
  24. *sscanf(str.substr(start,end-start).c_str(),"%d",&x)
  25. *
  26. *sscanf(a,b,c);
  27. *三个参数 将a中的字符串以b的格式写入到c中
  28. *
  29. *c_str() 据说是为了和C语言兼容,并不懂,有大神知道还请讲解
  30. *
  31. *substr() 复制
  32. */
  33. }
  34. return *this;
  35. }

在定义的结构体中,可以将一个大数以字符串的形式输入到结构体BigNum 中的 vector容器中,WIDTH的作用是将这个大数字符串分割成八个字符。

并且在结构体中重载了赋值运算符"="然后就可以像 BigNum a="1122334455667789891484684689" 这样对a进行赋值。

然后重载输入输出流运算符:

  1. ostream& operator << (ostream &out,const BigNum& x){
  2. out<<x.s.back(); //vector.back() 回传最后一个数据
  3. for(int i=x.s.size()-;i>=;i--){
  4. char buf[];
  5. sprintf(buf,"%08d",x.s[i]);
  6. for(int j=;j<strlen(buf);j++)
  7. out<<buf[j];
  8. /*
  9. *sprintf(a,b,c) 把c中的b格式的数据写入到a中
  10. */
  11.  
  12. }
  13. return out;
  14. }
  15. istream& operator >>(istream &in,BigNum& x){
  16. string s;
  17. if(!(in>>s)) return in;
  18. x=s;
  19. return in;
  20. }

重载之后,就可以使用 cin>>a; cout<<a; 进行输入输出。

ps:buf的大小是依据题目中的数据的大小而规定的。

重载 "+":

  1. BigNum operator +(const BigNum& b) const{
  2. BigNum c;
  3. c.s.clear();
  4. for(int i=,g=;;i++){
  5. if(g==&&i>=s.size()&&i>=b.s.size()) break;
  6. int x=g;
  7. if(i<s.size()) x+=s[i];
  8. if(i<b.s.size()) x+=b.s[i];
  9. c.s.push_back(x%BASE);
  10. g=x/BASE;
  11. }
  12. return c;
  13. }

附上完整代码:

  1. #include <iostream>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <stdio.h>
  6. using namespace std;
  7. struct BigNum{
  8. static const int BASE=;
  9. static const int WIDTH=;
  10. vector<int> s;
  11. BigNum(long long num=){ *this=num; }
  12. BigNum operator = (long long num){
  13. s.clear(); //vector.clear() 移除容器中的元素
  14. do{
  15. s.push_back(num%BASE); //vectro.push_back() 向尾部添加元素
  16. num/=BASE;
  17. }while(num>);
  18. return *this;
  19. }
  20. BigNum operator =(const string& str){
  21. s.clear();
  22. int x,len=(str.length()-)/WIDTH+;
  23. int mmm=str.length();
  24. for(int i=;i<len;i++){
  25. int end=str.length()-i*WIDTH;
  26. int start=max(,end-WIDTH);
  27. sscanf(str.substr(start,end-start).c_str(),"%d",&x);
  28. s.push_back(x);
  29. /*
  30. *sscanf(str.substr(start,end-start).c_str(),"%d",&x)
  31. *
  32. *sscanf(a,b,c);
  33. *三个参数 将a中的字符串以b的格式写入到c中
  34. *
  35. *c_str() 据说是为了和C语言兼容,并不懂,有大神知道还请讲解
  36. *
  37. *substr() 复制
  38. */
  39. }
  40. return *this;
  41. }
  42. BigNum operator +(const BigNum& b) const{
  43. BigNum c;
  44. c.s.clear();
  45. for(int i=,g=;;i++){
  46. if(g==&&i>=s.size()&&i>=b.s.size()) break;
  47. int x=g;
  48. if(i<s.size()) x+=s[i];
  49. if(i<b.s.size()) x+=b.s[i];
  50. c.s.push_back(x%BASE);
  51. g=x/BASE;
  52. }
  53. return c;
  54. }
  55. friend ostream& operator << (ostream &out,const BigNum& x);
  56. friend istream& operator >>(istream &in,BigNum& x);
  57. };
  58. ostream& operator << (ostream &out,const BigNum& x){
  59. out<<x.s.back(); //vector.back() 回传最后一个数据
  60. for(int i=x.s.size()-;i>=;i--){
  61. char buf[];
  62. sprintf(buf,"%08d",x.s[i]);
  63. for(int j=;j<strlen(buf);j++)
  64. out<<buf[j];
  65. /*
  66. *sprintf(a,b,c) 把c中的b格式的数据写入到a中
  67. */
  68.  
  69. }
  70. return out;
  71. }
  72. istream& operator >>(istream &in,BigNum& x){
  73. string s;
  74. if(!(in>>s)) return in;
  75. x=s;
  76. return in;
  77. }
  78. BigNum a,b,c;
  79. string A,B;
  80. int main(){
  81. int T;
  82. cin>>T;
  83. int flag=;
  84. while(T--){
  85. //cin>>A>>B;
  86. cin>>a>>b;
  87. //a=A;
  88. //b=B;
  89. c=a+b;
  90. cout<<"Case "<<flag<<":";
  91. cout<<endl;
  92. //cout<<A<<" "<<"+"<<" "<<B<<" = ";
  93. cout<<a<<" "<<"+"<<" "<<b<<" = ";
  94. if(T!=) cout<<c<<endl;
  95. else cout<<c;
  96. cout<<endl;
  97. flag++;
  98. }
  99. return ;
  100. }

ps:杭电对输出格式的控制真恐怖!!!

杭电acm 1002 大数模板(一)的更多相关文章

  1. 杭电ACM 1002题

    import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(S ...

  2. 杭电ACM(1002) -- A + B Problem II 大数相加 -提交通过

    杭电ACM(1002)大数相加 A + B Problem II Problem DescriptionI have a very simple problem for you. Given two ...

  3. 杭电ACM刷题(1):1002,A + B Problem II 标签: acmc语言 2017-05-07 15:35 139人阅读 评

    最近忙于考试复习,没有多少可供自己安排的时间,所以我利用复习之余的空闲时间去刷刷杭电acm的题目,也当对自己编程能力的锻炼吧. Problem Description I have a very si ...

  4. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  5. 杭电ACM题单

    杭电acm题目分类版本1 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最 ...

  6. 杭电acm习题分类

    专注于C语言编程 C Programming Practice Problems (Programming Challenges) 杭电ACM题目分类 基础题:1000.1001.1004.1005. ...

  7. 2017杭电ACM集训队单人排位赛 - 6

    2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...

  8. 高手看了,感觉惨不忍睹——关于“【ACM】杭电ACM题一直WA求高手看看代码”

    按 被中科大软件学院二年级研究生 HCOONa 骂为“误人子弟”之后(见:<中科大的那位,敢更不要脸点么?> ),继续“误人子弟”. 问题: 题目:(感谢 王爱学志 网友对题目给出的翻译) ...

  9. 杭电acm阶段之理工大版

    想參加全国软件设计大赛C/C++语言组的同学,假设前一篇<C和指针课后练习题总结>没看完的,请先看完而且依照上面的训练做完,然后做以下的训练. 传送门:http://blog.csdn.n ...

随机推荐

  1. easyui-validatebox 验证

    required: "必选字段",        remote: "请修正该字段",        email: "请输入正确格式的电子邮件" ...

  2. 面向对象的JavaScript

    多态 多态背后的思想是将"做什么"和"谁去做,怎样去做"分离开来,也就是将"不变的事物"与"可变的事物"分离开来. 其最 ...

  3. HTML,CSS,font-family:中文字体的英文名称 (宋体 微软雅黑)

    工作中遇到的问题,上网看到别人整理的,我就记下来,嘻嘻!!! 宋体 SimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 ...

  4. CSipSimple的插件结构

    CSipSimple的第三方编码器是以插件形式集成的,那么它是怎么实现的?我们以音频编码器为例进行说明. 一.何为插件 工程中有一个包,com.csipsimple.plugins.codecs.从包 ...

  5. python导入cx_Oracle报错的问题!

    import cx_Oracle 总是报错:ImportError: DLL load failed: 找不到指定的模块. 或者:ImportError: DLL load failed: %1 不是 ...

  6. 曲线拟合的最小二乘法(基于OpenCV实现)

    1.原理 在现实中经常遇到这样的问题,一个函数并不是以某个数学表达式的形式给出,而是以一些自变量与因变量的对应表给出,老师讲课的时候举的个例子是犯罪人的身高和留下的脚印长,可以测出一些人的数据然后得到 ...

  7. 如何在ashx页面获取Session值

    [转]   在一般事务处理页面,可以轻松的得到 Request,Response对象,从而进行相应的操作,如下: HttpRequest Request = context.Request; Http ...

  8. IOS setValue forKey

    NSObjiect *obj:[obj setValue:value forKey:@"cpname"]复制代码的时候都会出现这个异常this class is not key v ...

  9. php文件上传参考配置与大文件上传

      PHP用超级全局变量数组$_FILES来记录文件上传相关信息的,在php文件上传之前,可通过调节php.ini中相关配置指令,来控制上传相关细节. 1.file_uploads=on/off   ...

  10. AmazeUI定制

    定制流程 下载 Amaze UI 源码:从 GitHub 选择版本,点击 Source code (zip) 下载并解压(定制只适用于 Amaze UI 2.x): 下载安装 Node.js: 全局安 ...