#include<bits/stdc++.h> #define int long long using namespace std; vector<int> a(1000002); vector<int> m(1000002); signed main() { int n; cin>>n; m[0] = 1; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) m[i] = m[i-1] * a[i]; int cnt=0; m[0] = 1; for(int i=1;i<=n;i++) { int l, r; l = i - 1; r = n + 1; while(l + 1 < r) { int mid = (l + r) >> 1; if((m[mid]/m[i-1]%9)!=0&&m[i-1]!=0) l = mid; else r = mid; } cnt += n - l; } cout<<cnt; return 0; }上述代码在解决给出n个数a1,a2,...,an,现在希望选出一个闭区间l,r,使得该区间内所有数的乘积的递归数位和为9,递归数位和是指对一个数字一直求所有位上的和,直到数字小于10为止。请问有多少个区间满足上面的要求。提交时总是报错runtime error,请问如何修改,给出修改后的代码
时间: 2024-04-08 10:34:36 浏览: 75
这段代码的问题是在计算乘积的递归数位和时可能会出现除以0的情况。你需要在计算乘积之前添加一个判断条件来避免除以0。
此外,使用 `bits/stdc++.h` 是不推荐的做法,可以单独引入需要使用的标准库头文件,例如 `#include <iostream>`。
下面是修改后的代码:
```cpp
#include <iostream>
#include <vector>
#define int long long
using namespace std;
signed main()
{
int n;
cin >> n;
vector<int> a(n + 1);
vector<int> m(n + 1);
m[0] = 1;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
m[i] = m[i - 1] * a[i];
int cnt = 0;
for (int i = 1; i <= n; i++)
{
int l, r;
l = i - 1;
r = n + 1;
while (l + 1 < r)
{
int mid = (l + r) >> 1;
if (m[i - 1] != 0 && (m[mid] / m[i - 1] % 9) != 0)
l = mid;
else
r = mid;
}
cnt += n - l;
}
cout << cnt;
return 0;
}
```
通过以上修改,你应该可以避免除以0导致的运行时错误。请尝试重新运行代码并检查是否修复了问题。
阅读全文