LightOJ 1136 Division by 3(取模)

一些数1, 12, 123, 1234, ..., 12345678910, ... 然后给出两个数A, B,求出第A个数和第B数之间又多少个数能够被3整除。

首先要运用到一个性质:

一个数的数字和相加能被三整除,那么这个数也能被3整除。(1)

然后可以发现:

连续三个整数并排在一起组成的数的数字和必然能被3整除。(2)

最后通过(2)总结出:

1.题目中的第3K个数,必然能被三整除。

2. 题目中的第3K + 1个数,其第2个数字到最末一个数字之和必然能被3整除,再加上第一个数字,也就是1,就不能被3整除了。

3. 题目中的第3K + 2个数,其第3个数字到最末一个数字之和必然能被3整除,再加上第一、二个数字,也就是1 + 2 = 3,也能被3整除。

总结出这些规律,编码也就不难了。

#include<iostream>

using namespace std;

int main(){
	int A, B, T;
	int caseNo = 0;
	cin >> T;
	while(T--){
		int count = 0;
		cin >> A >> B;
		count = (B - A + 1) / 3 * 2;
		if((B - A + 1) / 3 * 3 == B - A - 1){
			if(B % 3 == 0 || B % 3 == 2)
				count++;
			if((B - 1) % 3 == 0 || (B - 1) % 3 == 2)
				count++;
		}
		if((B - A + 1) / 3 * 3 == B - A){
			if(B % 3 == 0 || B % 3 == 2)
				count++;
		}
		cout << "Case " << ++caseNo << ": " << count << endl;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值