Sicily 1029. Rabbit【高精度加法】

本文介绍了一道与斐波那契数列相关的编程题,通过分析题目得出规律,并采用高精度加法解决大数据规模下的计算问题。提供了完整的C++代码实现。

题目链接在此

 

这道题从题目的描述中可看出端倪。当m=2的时候,每个月兔子的对数构成的序列活脱脱就是斐波那契数列(初始值为1,即a[0]=1;第1个月为2,即a[1]=2;第2个月为3,即a[2]=3;第3个月为5,即a[3]=5……)。

仔细找一找规律可以发现,有如下的规律:rabbit[i] = rabbit[i-1] + rabbit[i-m]   而当i<m的时候,rabbit[i] = i +1 

 

这道题另外要注意的地方就是数据规模大,要用到加法的地方基本上都要使用高精度加法。

 

源代码和注释如下:

 

 

#include<iostream>
#include<string>

using namespace std;

int charToInt(char a) {  //  字符转成整型的函数
	return a - '0';
}

char intToChar(int n) {  //  整型转成字符的函数
	return n + '0';
}

string intToString(int n) {  //  自己写的整型转成字符串的函数。可以考虑用itoa,但稍微麻烦了点,且担心西西里不给用。
<span style="white-space:pre">	</span>string result = "";
<span style="white-space:pre">	</span>do  {
<span style="white-space:pre">		</span>result = intToChar(n % 10) + result;
<span style="white-space:pre">		</span>n /= 10;
<span style="white-space:pre">	</span>} while (n != 0);
<span style="white-space:pre">	</span>return result;
}

string highPrecisionAdding (string a, string b) {  //  高精度加法
	if (a.size() > b.size())  //  确保a短b长
		swap(a, b);
	
	while(a.size() < b.size())  //  差的地方补上前导0
		a = "0" + a;
	
	string result(a.size() , '0');
	int carry = 0;

	for (int i = a.size() - 1; i >= 0; i--) {
		result[i] = intToChar( (charToInt(a[i]) + charToInt(b[i]) + carry) % 10 );
		carry = (charToInt(a[i]) + charToInt(b[i]) + carry) / 10;
	}

	return carry ? ("1" + result) : result;
}

int main() {
	int m, d;  //  m是成年所需月数, d是"d月后"中的d

	while (cin >> m >> d && m && d) {
		string sum = "0";
		string rabbit[101];

		for (int i = 0; i <= d; i++) {
			if (i < m)
				rabbit[i] = highPrecisionAdding(intToString(i), "1");  //  i不会超过100
			else
				rabbit[i] = highPrecisionAdding( rabbit[i - 1] , rabbit[i - m] );
		}

		cout << rabbit[d] << endl;
	}

	return 0;
}

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值