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

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

首先定义大数的结构体:

struct BigNum{
static const int BASE=;
static const int WIDTH=;
vector<int> s;
BigNum(long long num=){ *this=num; }
BigNum operator = (long long num){
s.clear(); //vector.clear() 移除容器中的元素
do{
s.push_back(num%BASE); //vectro.push_back() 向尾部添加元素
num/=BASE;
}while(num>);
return *this;
}
BigNum operator =(const string& str){
s.clear();
int x,len=(str.length()-)/WIDTH+;
int mmm=str.length();
for(int i=;i<len;i++){
int end=str.length()-i*WIDTH;
int start=max(,end-WIDTH);
sscanf(str.substr(start,end-start).c_str(),"%d",&x);
s.push_back(x);
/*
*sscanf(str.substr(start,end-start).c_str(),"%d",&x)
*
*sscanf(a,b,c);
*三个参数 将a中的字符串以b的格式写入到c中
*
*c_str() 据说是为了和C语言兼容,并不懂,有大神知道还请讲解
*
*substr() 复制
*/
}
return *this;
}

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

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

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

ostream& operator << (ostream &out,const BigNum& x){
out<<x.s.back(); //vector.back() 回传最后一个数据
for(int i=x.s.size()-;i>=;i--){
char buf[];
sprintf(buf,"%08d",x.s[i]);
for(int j=;j<strlen(buf);j++)
out<<buf[j];
/*
*sprintf(a,b,c) 把c中的b格式的数据写入到a中
*/ }
return out;
}
istream& operator >>(istream &in,BigNum& x){
string s;
if(!(in>>s)) return in;
x=s;
return in;
}

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

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

重载 "+":

BigNum operator +(const BigNum& b) const{
BigNum c;
c.s.clear();
for(int i=,g=;;i++){
if(g==&&i>=s.size()&&i>=b.s.size()) break;
int x=g;
if(i<s.size()) x+=s[i];
if(i<b.s.size()) x+=b.s[i];
c.s.push_back(x%BASE);
g=x/BASE;
}
return c;
}

附上完整代码:

 #include <iostream>
#include <string.h>
#include <algorithm>
#include <vector>
#include <stdio.h>
using namespace std;
struct BigNum{
static const int BASE=;
static const int WIDTH=;
vector<int> s;
BigNum(long long num=){ *this=num; }
BigNum operator = (long long num){
s.clear(); //vector.clear() 移除容器中的元素
do{
s.push_back(num%BASE); //vectro.push_back() 向尾部添加元素
num/=BASE;
}while(num>);
return *this;
}
BigNum operator =(const string& str){
s.clear();
int x,len=(str.length()-)/WIDTH+;
int mmm=str.length();
for(int i=;i<len;i++){
int end=str.length()-i*WIDTH;
int start=max(,end-WIDTH);
sscanf(str.substr(start,end-start).c_str(),"%d",&x);
s.push_back(x);
/*
*sscanf(str.substr(start,end-start).c_str(),"%d",&x)
*
*sscanf(a,b,c);
*三个参数 将a中的字符串以b的格式写入到c中
*
*c_str() 据说是为了和C语言兼容,并不懂,有大神知道还请讲解
*
*substr() 复制
*/
}
return *this;
}
BigNum operator +(const BigNum& b) const{
BigNum c;
c.s.clear();
for(int i=,g=;;i++){
if(g==&&i>=s.size()&&i>=b.s.size()) break;
int x=g;
if(i<s.size()) x+=s[i];
if(i<b.s.size()) x+=b.s[i];
c.s.push_back(x%BASE);
g=x/BASE;
}
return c;
}
friend ostream& operator << (ostream &out,const BigNum& x);
friend istream& operator >>(istream &in,BigNum& x);
};
ostream& operator << (ostream &out,const BigNum& x){
out<<x.s.back(); //vector.back() 回传最后一个数据
for(int i=x.s.size()-;i>=;i--){
char buf[];
sprintf(buf,"%08d",x.s[i]);
for(int j=;j<strlen(buf);j++)
out<<buf[j];
/*
*sprintf(a,b,c) 把c中的b格式的数据写入到a中
*/ }
return out;
}
istream& operator >>(istream &in,BigNum& x){
string s;
if(!(in>>s)) return in;
x=s;
return in;
}
BigNum a,b,c;
string A,B;
int main(){
int T;
cin>>T;
int flag=;
while(T--){
//cin>>A>>B;
cin>>a>>b;
//a=A;
//b=B;
c=a+b;
cout<<"Case "<<flag<<":";
cout<<endl;
//cout<<A<<" "<<"+"<<" "<<B<<" = ";
cout<<a<<" "<<"+"<<" "<<b<<" = ";
if(T!=) cout<<c<<endl;
else cout<<c;
cout<<endl;
flag++;
}
return ;
}

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. RegExp

    var str = "1a1b1c";var reg = new RegExp("1(.)", "g");alert(reg.test(st ...

  2. Eclipse中的一些快捷键的使用

    Eclipse是一款强大的编程工具,在使用的过程中,若能够有效的使用其快捷键,效率会得到很大的提升,下面是一些常用的eclipse快捷键,可谓是键键精彩. 1.成单词:Alt+/ 2 重构之重命名:S ...

  3. css 之 文本缩进属性(text-indent)

    文章转自:http://www.10wy.net/Article/CSS/CSS_list_8.html查看更多更专业性的文章请到:网页设计网 文本缩进属性(text-indent) 这个属性设定文本 ...

  4. Python学习笔记-抽象

    懒惰即美德.代码量少. hasattr判断函数是否可用. 创建函数. def hello(name) return 'hello,'+name+'!' 文档化函数: 加注释(#开头) 文档字符串.函数 ...

  5. Javascript的函数自调

    嗯 也不知道怎么翻译self-invoked,就当自调吧. 在看bootstrap的轮播插件源码的时候发现一种新的自调函数的写法(其实应该不新了),开头的一段就卡住了,原谅我是个菜鸟,就顺便记录一下. ...

  6. PyCharm 3.4.1注册码

    PyCharm 3.4下载地址:http://www.jetbrains.com/pycharm/download/index.html PyCharm 3.0 注册码 PyCharm3 序列号 Li ...

  7. Quartz Core框架之core animation

    1.时间功能 (1)CFTimeIntervalCACurrentMediaTime ( void ); :返回当前的绝对时间 2.转换功能 (1)bool CATransform3DIsIdenti ...

  8. Android Studio Problem : failed to find style 'textviewstyle' in current theme 解决方法

    新建一个空白的MainActivity时Preview就出现一个错误: failed to find style 'textviewstyle' in current theme 开始在国内的博客平台 ...

  9. GGXX的卡通渲染实现 真的好变态......

    最近在youtube上看了GDC,学了很多东西,最让我震撼的就是ggxx的卡通渲染了.感慨一下,想要用3D做出二次元的效果,真的不容易.现记录一些要点: 1)不要使用normal map来做cel-s ...

  10. 球形环境映射之angular与latlong格式互换

    这么做只是纯好奇,因为这种格式互换在实际中是没有意义的,下面映射方式互换的贴图说明了一切. 刚开始打算使用matlab进行贴图映射方式的转换,但许久不用很是生疏,而且生成图片要考虑很多事情,尤其是生成 ...