解题思路: 本题提供俩种思路(经笔者测试均能通过):
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分
5 人评分