李巨帅


私信TA

用户名:168888

访问量:8161

签 名:

快乐每一天!

等  级
排  名 1527
经  验 2808
参赛次数 0
文章发表 18
年  龄 0
在职情况 学生
学  校 武汉软件
专  业

  自我简介:

解题思路: 本题提供俩种思路(经笔者测试均能通过):

1、直接法,用递归直接求出准确数值,数值有限制。

2、偷梁换柱法,利用大数相加法,输出string类型,数值可以超大!

附图:

1、直接法:

1013.png


2、偷梁换柱法:

1013(2).png

10134.png


注意事项: 掌握递归的运用及大数相加法即可快速解决本题!

参考代码:

/*#1、直接法*/
#includeusing namespace std;
int types(int n)
{
	if (n == 1)return 1;
	else return 10 * types(n - 1);
}
double two(int n)
{
	if (n == 1)return 2*types(1);
	else if (n >= 2)return 2 * types(n) + two(n - 1);
}
double sum(int n)
{
	if (n == 1)return two(1);
	else if (n >= 2)return two(n) + sum(n - 1);
}
int main(void)
{
	int n;
	cin >> n;
	cout << sum(n);
	return 0;
}
/*#2、偷梁换柱法*/
#include#includeusing namespace std;
//大数相加法
string add(string num1, string num2)
{
	if (num1.size() < num2.size()) {//把num1固定为位数较大的那个数,方便后面处理
		string temp = num1;
		num1 = num2;
		num2 = temp;
	}
	int length1 = num1.size(), length2 = num2.size(), flag = 0, a, b, sum;//flag是进位标记
	while (length1 > 0) {//从低位开始把对应的位相加
		a = num1[length1 - 1] - '0';//获取num1当前位的数字
		if (length2 > 0)//如果num2还没加完(注意,num2是位数较少的)
			b = num2[length2 - 1] - '0';//获取num2当前位的数字
		else
			b = 0;//如果num2加完了,num2对应位上就没有数来加了
				//这时我没有break,因为虽然num2没有数字来加了,但可能还有进位需要加
		sum = a + b + flag;//num1与num2对应位上的数字相加,再加上进位位
		if (sum >= 10) {//如果加起来大于于10,那就需要进位了
			num1[length1 - 1] = '0' + sum % 10;//计算加完之后,当前位应该是多少
			flag = 1;//把进位标记置1
		}
		else {
			num1[length1 - 1] = '0' + sum;//计算加完之后,当前位应该是多少
			flag = 0;//把进位标记置0
		}
		length1--;//向高位移动1位
		length2--;//向高位移动1位
	}
	//如果两个数对应位都加完了,进位位是1,说明位数要增加1了
	//比如99+1,加完之后,变成了三位数100,其实就是再在前面加一位1
	if (1 == flag)
		num1 = "1" + num1;
	return num1;
}
string num(int n)
{
	if (n == 1)return "2";
	else return "2" + num(n - 1);
}
string sum(int n)
{
	if (n == 1)return num(1);
	else if (n >= 2)return add(num(n), sum(n - 1));
}
int main(void)
{
	int a;
	cin >> a;
	cout << sum(a);
	return 0;
}

ps:如果对您有帮助,请给在下一个赞,感激不尽!!!

 

0.0分

5 人评分

  评论区

  • «
  • »