1029. Rabbit

1.一个简单的递归求和即可

2.m = 1应该是特殊的情况

#include<iostream>
#include<string>
#include<vector>
using namespace std;

class BigNum
{
public:
	BigNum()
	{
		this->num = "0";
	}
	BigNum(string n)
	{
		this->num = n;
	}
	string getNum()
	{
		return this->num;
	}

	friend BigNum operator +(const BigNum &n1, const BigNum &n2)
	{
		string temp;//和的倒置
		int carry = 0;
		//计算结果
		for(int i = n1.num.length() - 1, j = n2.num.length() - 1; i >= 0 || j >= 0; i--, j--)
		{
			if(i >= 0 && j >= 0)//两者、进位之和
			{
				temp.push_back(((n1.num[i] - 48) + (n2.num[j] - 48) + carry) % 10 + 48);//存储结果
				if((n1.num[i] - 48) + (n2.num[j] - 48) + carry > 9)//有新的进位
				{
					carry = 1;//两个十进制之和的进位不会超过1
				}
				else//没有进位
				{
					carry = 0;
				}
			}
			else//某一个数的位数已经结束
			{
				if(i >= 0)
				{
					temp.push_back(((n1.num[i] - 48) + carry) % 10 + 48);
					if((n1.num[i] - 48) + carry > 9)
					{
						carry = 1;
					}
					else
					{
						carry = 0;
					}
				}
				else//j >= 0
				{
					temp.push_back(((n2.num[j] - 48) + carry) % 10 + 48);
					if((n2.num[j] - 48) + carry > 9)
					{
						carry = 1;
					}
					else
					{
						carry = 0;
					}
				}
			}
		}
		if(carry == 1)//最高进位
			temp.push_back('1');

		//获取正确的结果
		string rev;
		bool flag = true;//去除头部的0 
		for(int i = temp.length() - 1; i >= 0; i--)
		{
			if(temp[i] == '0' && flag)
			{
				continue;
			}
			else
				flag = false;

			rev.push_back(temp[i]);
		}

		//创建一个BigNum对象,并返回
		BigNum sum(rev);
		return sum;
	}

	friend ostream& operator<<(ostream& outs, const BigNum& n)
	{
		outs << n.num;
		
		return outs;
	}
private:
	string num;
	
};

int main()
{
	int m, d;
	vector<BigNum> rabbit;//rabbit[0]表示已经成年,rabbit[1]表示还有1个月才成年
	while(cin >> m >> d && m != 0)
	{
		rabbit.clear();
		BigNum first("1");//一开始有一对
		rabbit.push_back(first);
		for(int i = 1; i < m; i++)
		{
			BigNum temp;
			rabbit.push_back(temp);
		}

		for(int i = 0; i < d; i++)
		{
			if(m != 1)
			{
				BigNum temp = rabbit[0];//生育
				for(int j = 0; j < m - 1; j++)
				{
					if(j == 0)
					{
						rabbit[j] = rabbit[j] + rabbit[j + 1];
					}
					else
					{
						rabbit[j] = rabbit[j + 1];
					}
				}
				rabbit[m - 1] = temp;
			}
			else
			{
				rabbit[0] = rabbit[0] + rabbit[0];
			}
		}

		BigNum sum;
		for(int i = 0; i < m; i++)
		{
			sum = sum + rabbit[i];
		}

		cout << sum << endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值