首页 > 试题广场 >

被3整除

[编程题]被3整除
  • 热度指数:2801 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。

并且小Q对于能否被3整除这个性质很感兴趣。

小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。


输入描述:
输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。


输出描述:
输出一个整数, 表示区间内能被3整除的数字个数。
示例1

输入

2 5

输出

3

说明

12, 123, 1234, 12345...
其中12, 123, 12345能被3整除。
能被3整除的数是每个位置上各个位置上数加起来的数能够被3整除,此外,不能被3整除的数
各位相加为除3的余数,故余数为120120120...,发现本题中只有被3整除为1的数不能被3整除
#include<iostream>
using namespace std;
int main()
{
    int count = 0;
    int l , r;
    cin >> l >> r;
    for(int i = l; i <= r; ++i)
    {
        if((i%3==1)?false:true)
        {
            count = count + 1;
        }
    }
    cout << count<< endl;
    return 0;
}

发表于 2018-08-11 09:53:32 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int left = scanner.nextInt();
        int right = scanner.nextInt();
        int result = (right - left)/3*2;
        int temp1 = (right - left) % 3;
        int temp2 = left % 3;
        if(temp2 == 0){
            result += (temp1 < 2 ? 1 : 2);
        }else if(temp2 == 1){
            result += temp1;
        }else{
            result += Math.min(1+temp1, 2);
        }
        System.out.println(result);
    }
}
从第一个数开始,能被3整除结果为 FFTFFTFFTFFT...(F不能被3整除,T能被3整除),即每3个数中有2个可以被3整除,判断下区间端点能否被3整除的情况即可。
发表于 2018-05-30 16:13:06 回复(3)
#include <iostream>

using namespace std;

int main()
{
    long long l, r;
    cin >> l >> r;
    int count = 0;
    long long sum = 0;
    sum += (l*(l + 1)) / 2;
    if (sum % 3 == 0)
    {
        count++;
    }
    if (r - l > 0) {
        for (int i = l + 1; i <= r; i++)
        {
            sum += i;
            if (sum % 3 == 0)
                count++;
        }
    }
    cout << count << endl;
    return 0;
}
编辑于 2018-08-12 21:50:46 回复(0)
复杂度O(1)
#include <cstdio>
using namespace std;
int main()
{
    int   l,r,sum=0;
    scanf("%d%d", &l, &r);
    while((l%3!=0&&(r%3)!=(l%3-1))||(l%3==0&&r%3!=2))
    {
        r++;
        if(r%3!=1)
            sum--;
    }
    sum+=(r-l+1)/3*2;
    printf("%d\n", sum);
}

发表于 2019-01-26 20:42:29 回复(0)


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int l = scanner.nextInt();
        int r = scanner.nextInt();

        int res = 0;
        for (int i = l; i <= r; ++i) {
            if (i % 3 == 0 || (i + 1) % 3 == 0) {
                ++res;
            }
        }
        System.out.println(res);
        scanner.close();
    }
}
编辑于 2018-09-08 09:36:59 回复(0)
#include <cstdio>

int main()
{
    int start, end, i;
    int num = 0;
    long long temp = 0;
    scanf("%d %d", &start, &end);
    for (i = 1; i < start; ++i)
        temp += i;
    for (; i <= end; ++i) {
        temp += i;
        if (!(temp%3))
            ++num;
    }
    printf("%d", num);
    return 0;
}

先把起始点的总和算出来
再依次加上去就好了,求能否被3整除

发表于 2018-08-11 10:09:02 回复(0)
while True:
    try:
        line=raw_input().strip()
        if line=='':
            break
        l=int(line.split()[0])
        r=int(line.split()[1])
        if l%3==0:
            count=(r-l+1)//3
            if (r-l+1)%3>=2:
                count+=1
        elif l%3==1:
            count=(r-l+1)//3
            if (r-l+1)%3>=1:
                count+=1
        else:
            count=(r-l+1)//3
        print((r-l+1)-count)
    except:
        break

发表于 2018-07-30 17:03:10 回复(0)
难道是我理解有问题?这道题的意思难道不是一个大数的每位相加吗???
1234567891011 不应该为1+2+3+4+5+6+7+8+9+1+0+1+1能否被3整除吗???
好吧我妥协,=-=
#include<stdio.h>
#include<iostream>
using namespace std;
class Solution
{
public:
    int Get_ValSum(int val)
    {
        int sum = 0;
        while(val != 0)
        {
            sum+=(val % 10);
            val/=10;
        }
        return sum;
    }
    int GetTheNumOfSpecNUMBER(int _bottom, int _top)
    {
        long long count = 0;
        long long sum = 0;
        long long val = 0;
        while (_bottom-- > 0)
        {
            val++;
            sum = sum + val;
        }
        while (val <= _top)
        {
            if (sum % 3 == 0)
                count++;
            val++;
            sum = sum + val;
        }
        return count;
    }
};
int main(void)
{
    int bottom,top;
    scanf("%d %d",&bottom,&top);
    cout << Solution().GetTheNumOfSpecNUMBER(bottom,top) << endl;
    
    return 0;
}

发表于 2018-06-20 21:21:00 回复(0)
#include<iostream>
using namespace std;
int main()
{
    long long l, r,num = 0;
    cin >> l >> r;
    long long s= l*(l - 1) / 2;
    for (; l <= r; l++)
    {
        s+=l;
        if (!(s % 3)) num++;
    }
    cout << num << endl;
}

编辑于 2018-08-19 21:57:12 回复(10)
经典找规律
#include <iostream>
using namespace std;
int division3(int l, int r) {
	int times = 0;
	for (int i = l; i <= r; i++)
		if (i % 3 != 1)
			times++;
		return times;
}

int main() {
	int l, r;
	cin >> l >> r;
	cout << division3(l, r);
}


发表于 2020-09-08 15:32:29 回复(0)
直接用前n项和公式%3
#include<iostream>
(720)#include<math.h>
using namespace std;
void input(long long l, long long r)
{
	long long n = 0;
	long long s = 0;
	for (l; l <= r; l++)
	{
		s = (l*(1 + l)) / 2;//:前n项和公式
		if (s % 3 == 0)
		{
			n++;
		}
	}
	cout<<n<<endl;
}
int main()
{
	int l;
	scanf("%d", &l);
	int r;
	getchar();
	scanf("%d", &r);
	input(l, r);
	return 0;
}


发表于 2020-03-29 14:03:13 回复(0)

F1

T12

T123

F1234

T12345

T123456

F1234567

T12345678

T123456789

F12345678910

T1234567891011

T123456789101112

1 4 7 10 13  不行

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int sNum = sc.nextInt();
        int count = 0;
        int eNum = sc.nextInt();
        int num = eNum-sNum+1;
        for (int i=sNum;i<=eNum;i++){
            if(i%3-1==0){
                count++;
            }
        }
        System.out.println(num-count);
    }
}

 

发表于 2019-08-24 16:26:26 回复(0)
#include <bits/stdc++.h>
usingnamespacestd;
intmain(void){
    intl=0,r=0;
    cin>>l>>r;
    intcount=0;
    for(inti=l;i<=r;++i){
        if((i-1)%3==0){
            count++;
        }
    }
    cout<<(r-l+1)-count<<endl;
     
     
     
     
    return0;
}
发表于 2019-06-24 13:00:37 回复(0)
#include<iostream>
usingnamespacestd;
intmain(){
    intl,r;
    cin>>l>>r;
    cout<<2*r/3-(l-1)*2/3<<endl;
    return0;
}

发表于 2019-04-03 18:39:43 回复(0)
#include<cstdio>
#include<iostream>
 
usingnamespacestd;
 
intmain()
{
    inta,b,sum=0,cnt=0;
    cin>>a>>b;
    for(inti=1;i<=b;++i)
    {
        if(i>=a&&(i%3==0||(i+1)%3==0))
            cnt++;
    }
    cout<<cnt<<endl;
     
}
  • An=10An-1 + n;
  • An=9An-1 +n;
  • ........
  • An=....+A1+1+2+...+n
  • An=....+n*(n+1)/2

发表于 2019-03-16 13:58:28 回复(0)
// 分析
// 1 -> 1        1       % 3 == 1
// 2 -> 12       12      % 3 == 0
// 3 -> 123      123     % 3 == 0
// 4 -> 1234     1234    % 3 == 1
// 5 -> 12345    12345   % 3 == 0
// 6 -> 123456   123456  % 3 == 0
// 7 -> 123457   1234567 % 3 == 1
// 1001001.....
#include <iostream>

using namespace std;

int main()
{
    long long l, r;
    int count = 0;
    while (cin >> l >> r){
        for (long long i = l; i <= r; ++i ){
            if (i % 3 != 1 )
                ++count;
        }
        cout << count << endl;
    }
}

发表于 2018-09-08 11:59:06 回复(0)

#include<iostream>
using namespace std;
int mian()
{ int n,m; int sum=0; cin>>n>>m; for(;n<=m;n++) {   if((n+1)%3==0||n%3==0)//三个中俩个可以被3整除   sum++; } cout<<sum; return 0; }

发表于 2018-08-02 10:45:16 回复(0)
#include<iostream>
using namespace std;
int main()
{
    unsigned int l, r;
    while (cin >> l >> r)
    {
        int count = 0;
        for (unsigned int i = l; i <= r; ++i)
        {
            unsigned int totle = (1 + i)*i / 2;
            if (totle % 3 == 0)
                count++;
        }
        cout << count << endl;
    }
    return 0;
}

编辑于 2018-07-21 22:08:15 回复(0)
int left3(int s)//求第一个到第s个可以被3整除的个数
{
    int sum = 0;
    sum = s / 3 * 2;
    if (s % 3 == 2)
        sum++;
        return sum;
}
//right之前的个数减去 left-1之前的个数就是   left到right之间所有的可以被3整除的个数。
int main() {     int l, r;     int sum=0;     cin >> l >> r;          sum=left3(r);     if (l % 3 == 2 || l % 3 == 0)         sum = sum - left3(l-1);     cout << sum<<endl;     return 0; }

编辑于 2018-07-01 11:28:02 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int l,r;
    cin>>l>>r;
    int i,j;
    for(i = 0;i <= 2;i++)
        if((l + i) %3 == 1)
            break;
    for(j = 0;j <=2;j++)
        if((r + j) %3 == 0)
            break;
    int temp = ((r+j-l-i) / 3) << 1;
    temp = temp + i - j;
    cout << temp<<endl;
}
发表于 2018-06-21 15:54:11 回复(0)