牛客网 2019校招真题在线编程 被3整除

被3整除

通项公式

jachy
https://www.nowcoder.com/profile/3650011/codeBookDetail?submissionId=66546466

各个位之和可以算成(i+1)*i/2,这里如果是大于等于两位数,它算成一个数和把每一位分开计算对3取余的结果都是一样的,所以没关系。 所以,直接遍历l到r,根据通项公式判断即可。

#include
using namespace std;
typedef long long ll;
 
int main(){
    ll l , r;
    while(cin >> l >> r){
        ll count = 0;
        for(int i = l; i <= r; i++){
            if((i+1)*i/2 % 3 == 0)    count++;
        }
        cout << count << endl;
    }
    return 0;
}

巧解

Islotus
https://www.nowcoder.com/profile/3650011/codeBookDetail?submissionId=66546466

#include
using namespace std;
 
int main(){
    int left, right;
    int result = 0;
     
    cin >> left >> right;
    for(int i=left; i<=right; ++i){
        switch(i%3){
            case 1: ;break;
            case 2: ++result;break;
            case 0: ++result;break;
        }
    }
    cout << result << endl;
}

牛客网 2019校招真题在线编程 被3整除_第1张图片

暴力直解

#include
using namespace std;
typedef long long ll;
ll exactDivision(ll l,ll r){
    if(l==0) l++;
    ll res=0,add=0;
    for(ll i=1;i<l;i++){
        add+=i;
    }
    for(ll i=l;i<=r;i++){
        add+=i;
        if(add%3==0) res++;
    }
    return res;
};
int main(){
    ll l,r;
    cin>>l>>r; 
    ll res=exactDivision(l,r);
    cout<<res<<endl;
    return 0;
}

你可能感兴趣的:(牛客网-熟悉笔试环境)