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

今下午对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>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值