c++编程问题
1个回答
关注
展开全部
亲,您好。以下是一个可能的 C++ 实现,实现思路是先预处理出每个位置开始的数字串和对应的和,然后对于每个查询区间,通过前缀和的差值来计算区间内的数字和。具体实现如下:#include #include using namespace std;const int N = 1e6 + 10, MOD = 1e4;int n, q;char s[N];int sum[N], f[N]; // f[i] 表示以 i 开始的数字串的和int main(){ scanf("%d%d", &n, &q); scanf("%s", s);
咨询记录 · 回答于2023-05-12
c++编程问题
这道题怎么做,用初学者的方式做
亲,您好。以下是一个可能的 C++ 实现,实现思路是先预处理出每个位置开始的数字串和对应的和,然后对于每个查询区间,通过前缀和的差值来计算区间内的数字和。具体实现如下:#include #include using namespace std;const int N = 1e6 + 10, MOD = 1e4;int n, q;char s[N];int sum[N], f[N]; // f[i] 表示以 i 开始的数字串的和int main(){ scanf("%d%d", &n, &q); scanf("%s", s);
// 预处理 f 数组 for (int i = n - 1; i >= 0; i--) { if (isdigit(s[i])) { int j = i; while (j < n && isdigit(s[j])) j++; int num = 0; for (int k = i; k < j; k++) num = num * 10 + s[k] - '0'; f[i] = (f[j] + num) % MOD; i = j - 1; } else f[i] = f[i + 1]; }
// 计算 sum 数组 for (int i = 0; i < n; i++) sum[i + 1] = sum[i] + (isdigit(s[i]) ? s[i] - '0' : 0); // 回答查询 while (q--) { int l, r; scanf("%d%d", &l, &r); int res = ((f[l] - f[r + 1] + MOD) % MOD + MOD) % MOD; res = (res + (sum[r + 1] - sum[l])) % MOD; printf("%d\n", res); } return 0;}
在这个实现中,首先对输入的字符串进行预处理,计算出每个位置开始的数字串和对应的和。然后,计算前缀和数组 sum,表示从开头到当前位置的数字和。最后,对于每个查询区间,通过前缀和的差值来计算区间内的数字和。