问题描述
对于这样一个数列,1,12,123,⋯⋯ ,12345678910, 1234567891011。给出两个端点left, right 。计算从数列的第left个数到第right个(包含端点)数中有多少个数可以被3整除。
解决方法
寻找规律:
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
数字 | 1 | 12 | 123 | 1234 | 12345 | 123456 | 1234567 | 12345678 | 123456789 |
数字模3 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
根据上面的表格,发现从第一个开始,连续的三个数中有两个数可以被3整除。记f(n)为从第1个数到第n个数中能被3整除的数的个数,则f(n) = n / 3 * 2 + (n % 3 == 2)。对于区间[left, right]中能被3整除的数的个数
ans=f(right)−f(left−1)ans=f(right)−f(left−1)
代码
#include <iostream>
using namespace std;
int main()
{
int l, r;
cin >> l >> r;
int ans;
int r1 = r / 3 * 2 + (r % 3 == 2);
int l1 = (l-1) / 3 * 2 + ((l-1) % 3 == 2);
ans = r1 - l1;
cout << ans;
return 0;
}