1.想这这种分析起来很有规律,但是找到的时候,就可以猜结论赌一下了。
2.题目样例:输入:12345 输出:13715。你会发现 12345+1234+123+12+1=13715。
3.发现前缀和特点:写在代码里面
4.代码
//前缀和特点:
/* 列计算竖式--> 1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
*/
//你会发现每一位上如果不进位的话,值会等于他前面数位上数字的和(前缀和)
#include <iostream>
#include<algorithm>
using namespace std;
const int N = 4e5 + 10;
char arr[N];
int pre[N];
void sovle() {
int n;
cin >> n;
pre[0] = 0;
//前缀和
for (int i = 1; i <= n; i++) {
cin >> arr[i];
pre[i] = arr[i] - '0' + pre[i - 1];
}
//从个位开始处理进位
for (int i = n; i >= 1; i--) {
pre[i - 1] += pre[i] / 10;
pre[i] %= 10;
}
//因为最后可能在'1'数位上的数也会进位,所以从一开始遍历
bool flag = false;
for (int i = 0; i <= n; i++) {
//从前开始遍历时只要遇到一个不为零的数,那么后面所有的零都是合法的
if (pre[i] != 0 || flag == true) {
flag = true;
cout << pre[i];
}
}
cout << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
sovle();
}
return 0;
}