[C/C++]被3整除 - 2019校招编程刷题
参考链接
题目描述
小Q得到一个神奇的数列: 1, 12, 123,…12345678910,1234567891011…。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
输入描述
输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。
输出描述
输出一个整数, 表示区间内能被3整除的数字个数。
输入例子1:
2 5
输出例子1:
3
说明:
12, 123, 1234, 12345…
其中12, 123, 12345能被3整除。
思路:
- 1,12,123,1234这样的字符串能否被3整除是有规律的
1 | 12 | 123 | 1234 | 12345 | 123456 | 1234567 | 12345678 | 123456789 |
---|---|---|---|---|---|---|---|---|
× | √ | √ | × | √ | √ | × | √ | √ |
- 三个一循环,每个循环中有2个是可以被3整除的。因此,就算出L,R这个范围内有N个3,总数就是N*2 + 范围%3(看余数范围有几个成立即可)
Just show my code
代码(c++/c)
#include<iostream>
using namespace std;
int isThree(int n){
if (n % 3 == 0 ){
return 1;
}else if(n % 3==1){
return 0;
}else{
return 1;
}
}
int main(){
int L,R;
cin >> L >> R; // 左端点和右端点
int n = ((R - L + 1)/3) * 2; // 被3整除的数字个数
if((R - L + 1) % 3 == 1){
//cout<<"1个:"<<isThree(L)<<endl;
n+= isThree(L);
}else if((R - L + 1) % 3 == 2){
//cout<<"2个:"<<isThree(L)<<" "<<isThree(L+1)<<endl;
n+= isThree(L);
n+= isThree(L+1);
}
cout<<n<<endl;
return 0;
}
如果我的文章能帮你节约20秒,就请你为我的文章点个赞吧!