矩阵取数游戏noip2006(c++ BigInteger的第一次运用)---重点!!
2016-06-29 18:27
525 查看
今下午对c++BigInteger进行了初步的了解
同时,经过这次,我才深深的体会到了c++的灵活之处
1.对Biginteger的初步认识
2.对c++一些关键字的初步认识
3.对vector的一点长进和对这些容器的感觉整体框架加深
4.对operator的认识又加深了
5.熟悉了对c++字符串的一些处理
一下将在注释中标明
同时,经过这次,我才深深的体会到了c++的灵活之处
1.对Biginteger的初步认识
2.对c++一些关键字的初步认识
3.对vector的一点长进和对这些容器的感觉整体框架加深
4.对operator的认识又加深了
5.熟悉了对c++字符串的一些处理
一下将在注释中标明
<span style="font-size:14px;">#include<cstdio> #include<cstdlib> #include<cstring> #include<vector> #include<algorithm> #include<iostream> #include<cstring> using namespace std; struct BigInteger { static const int base=100000000;//压位,所要mod的数 static const int width=8;//每一位占几位,这里是占8位 vector<int> s;//便于释放申请内存,但是可以改为数组来存,c【0】存数组大小,后面是数组 BigInteger (long long num=0) {*this=num;}//初始化 BigInteger operator =(long long num) { s.clear();//赋值之前要清空 do { s.push_back(num%base); num/=base; }while (num); return *this;//???????? } BigInteger operator =(const string &str) //如果有更改,就不能用const { s.clear();//清空 int x,len=(str.length()-1)/width+1;//压位后有多少位 for (int i=0;i<len;i++) { int end=str.length()-i*width;//由于数组是从0开始的,这里很巧妙 int start=max(0,end-width); sscanf(str.substr(start,end-start).c_str(),"%d",&x);///??? .c_str什么意思??? s.push_back(x); } return *this;//返回值 } BigInteger operator +(const BigInteger &b) const { BigInteger c; c.s.clear(); for (int g=0,i=0;;i++) { if (g==0&&i>=s.size()&&i>=b.s.size()) break; if (i<s.size()) g+=s[i]; if (i<b.s.size()) g+=b.s[i]; c.s.push_back(g%base); g/=base; }//加法,可以更改的 return c;//返回值 } BigInteger operator +=(const BigInteger &b) { *this=*this+b;return *this;//这样写 } BigInteger operator *(const BigInteger &b) const { BigInteger c; c.s.clear(); for (int i=1;i<=s.size()+b.s.size();i++)c.s.push_back(0);//乘法,先把数组大小确定 for (int i=0;i<s.size();i++) for (int j=0;j<b.s.size();j++) c.s[i+j]+=s[i]*b.s[j];//计算 for (int i=0;i<c.s.size()-1;i++) { c.s[i+1]+=c.s[i]/base; c.s[i]=c.s[i]%base; } //进位 while (c.s.back()==0&&c.s.size()>1) c.s.erase(c.s.end()-1);s.erase()删除某一位,这里是删除最后一位 return c;//但是请注意s.end()表示的是最后一位的后面的内存地址,由sort中就能看出来,但是最小不能越界,不能小于 }<span style="white-space:pre"> </span> //1,也就是既然有值,那么最小就是0,也一定是占一位的。s.back()表示最后面的数<span style="white-space:pre"> </span> bool operator < (const BigInteger &b) const { if (s.size()!=b.s.size()) return s.size()<b.s.size(); for (int i=s.size()-1;i>=0;i--) if (s[i]!=b.s[i]) return s[i]<b.s[i]; return false; } bool operator > (const BigInteger &b) const {return b<*this;} bool operator <=(const BigInteger &b) const {return !(*this>b);} bool operator >=(const BigInteger &b) const {return !(*this<b);} bool operator !=(const BigInteger &b) const {return *this>b||*this<b;} bool operator ==(const BigInteger &b) const {return *this>=b&&*this<=b;}//通过一个'<'变换出的其他的这些 }; ostream& operator<< (ostream &out,const BigInteger &x) { out<<x.s.back();//先把最高位输出,因为最高位不用补0,其他不够要补0 for (int i=x.s.size()-2;i>=0;i--) { char buf[20];// sprintf(buf,"%08d",x.s[i]);//为什么这里要有08,还有为什么不能直接输出?? //突然明白了,因为数字中可能有154000000000000000000000000000999的情况 //并且我们还要把0给输出来 %08d的意思是占8位,不够的用0补齐,而%8d也是占8位,不够的用空格补 for (int j=0;j<strlen(buf);j++) out<<buf[j]; } return out; } istream&/*这个&号不知道什么用*/ operator >> (istream &in,BigInteger &x) { string s;//输入 if (!(in>>s)) return in; x=s; return in; } int n,m; BigInteger a[100][100],f[100][100]; int main() { BigInteger ans; ans.s.clear();//清空 cin>>n>>m; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) cin>>a[i][j]; for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) for (int l=1;l<=m;l++) f[j][l].s.clear();//刚开始一定要清空 for (int j=m;j>=1;j--) for (int l=j;l<=m;l++) { BigInteger k=2,k1=f[j+1][l]+a[i][j],k2=f[j][l-1]+a[i][l]; if (k1>k2) f[j][l]=k1*k;else f[j][l]=k2*k; } ans=ans+f[1][m]; } cout<<ans; return 0; }</span>
相关文章推荐
- C++中的异常处理(三)
- C++中的异常处理(二)
- C++中的异常处理(一)
- 快排算法及利用快排思想寻找第k大(小)的数
- C++ ------------排序算法(冒泡排序-快速排序-选择排序-插入排序-希尔排序)
- C语言版iso8583报文拆包组包代码
- 一些程序段分析(1)
- notepad++编辑器打开一个文件时,给文件添加信息
- C++中的using
- C++中四种进程或线程同步互斥的控制方法
- 判断100-200内的素数
- 探讨C语言中关键字volatile的含义
- 欧几里得算法求n个数据的最大公约数
- 虚拟现实-VR-UE4-创建C++版工程
- C语言__attribute__
- C++自定义数据类型
- C语言之预处理命令与用typedef命名已有类型
- 用c语言编写猜随机数的游戏
- CEF3开发者系列之JS与C++交互之一
- C++著名类库