原题链接:[编程入门]Sn的公式求和
解题思路: 本题提供俩种思路(经笔者测试均能通过):
1、直接法,用递归直接求出准确数值,数值有限制。
2、偷梁换柱法,利用大数相加法,输出string类型,数值可以超大!
附图:
1、直接法:

2、偷梁换柱法:


注意事项: 掌握递归的运用及大数相加法即可快速解决本题!
参考代码:
/*#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分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复