您的位置:首页 > 编程语言 > C语言/C++

矩阵取数游戏noip2006(c++ BigInteger的第一次运用)---重点!!

2016-06-29 18:27 525 查看
今下午对c++BigInteger进行了初步的了解

同时,经过这次,我才深深的体会到了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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: