首页 > 试题广场 >

被3整除

[编程题]被3整除
  • 热度指数:1123 时间限制: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整除。
# coding=utf-8
while 1:
    try:
        start,end=map(int,raw_input().split())
        count=0
        #left=0
        def count_3(num):
            if num%3==0:
                count=(num/3)*2
            elif num%3==1:
                count=(num/3)*2
            elif num%3==2:
                count=(num/3)*2+1
            return count
        print count_3(end)-count_3(start-1)
        break
    except:
        break
做了很久最后发现蠢是原罪,找规律就好了,三个数中,×√√,所以就不会超出内存。刚开始做的时候一直往求和能否被3整除上面想,即是每逢3清零重新count还是会超出内存只通过百分之七十

发表于 2018-07-02 21:26:14 回复(0)

核心思想

  • 第一步:所有位上的数字之和能够被3整除,则这个数能够被3整除。
  • 第二步:所有位数之和能被3整除的这个验证过程再简化,我们能够发现:
1            
     1%3 = 1     
     1%3 = 1
12            
    (1+2)%3 = 0  
    ((1%3)+2%3)%3 = 0
123  
   (1+2+3)%3 = 0
    (((1%3)+2%3)%3+3%3)%3 = 0;
.....
......

// 这样是为了避免数字过大而超出了int范围。
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int count = 0;
        int start = sc.nextInt();
        int end = sc.nextInt();
        int pre = 0;
        int i = 0;
        //这里用等差数列的求和公式会超出int范围
        for(;i<start;i++){
            pre+=i%3;
            pre%=3;
        }
        for(;i<=end;i++){
            int tempMod = i%3;
            pre+=tempMod;
            if(pre%3==0){
                count++;
            }
            pre = pre%3;
        }
        System.out.println(count);
    }
}
编辑于 2018-06-13 00:48:40 回复(0)
import sys

def num(x):
    return x - (x+2)/3

l, r = [int(x) for x in sys.stdin.readline().split()]
print num(r)-num(l-1)
发表于 2018-08-10 04:12:46 回复(0)
importjava.util.Scanner;  public class Test {public static void main(String[] args) {
        Scanner sc = newScanner(System.in);  int a = sc.nextInt();  int b = sc.nextInt();  long result = count(a ,b);    System.out.println(result);  } private static int count(int start,int end){  if(start > end){  return 0;   }  intnum =0;  for (longi = start-1; i <= end;i++) {  longyushu = (((1+i))*i/2)%3;  if (yushu==0){
            num++;   }
     }  return num;    }
}


发表于 2019-07-30 23:22:40 回复(0)
 import java.util.Scanner;

public class Test {
public static void main(String[] args) {
    int a,a1;
    int b,b1;
    Scanner sc=new Scanner(System.in);
    while(true){
        System.out.println("请输入a");
        a=sc.nextInt();
        if((a-1)%3==2){    
            a1=(a-1)/3*2+1;
        }else{
            a1=a/3*2;
        }
        System.out.println("请输入b");
        b=sc.nextInt();
        if(b%3==2){
            b1=b/3*2+1;
        }else{
            b1=b/3*2;
        }
        System.out.println(b1-a1);
    }
}
}


发表于 2018-06-14 09:58:51 回复(0)
#include<iostream>

using namespace std;

int find_bit_num(int num)
{
 int n = 10;
 while(num / 10)
 {
  n *= 10;
 }
 return n;
}

int main(void)
{
 int l, r;
 cin>>l>>r;
 int num = 0, res = 0;
 for(int i = 1; i <= r; i++)
 {
  num = num * find_bit_num(i) + i;
  if(i >= l)
   if(num % 3 == 0)
    res++;
 }
 cout<<res<<endl;
 return 0;

发表于 2020-05-15 23:56:56 回复(0)
l,r=map(int,input().split())
deff(x):
    return(x+2)//3
result=r-l+1-f(r)+f(l-1)
print(result)
发表于 2019-08-26 13:29:19 回复(0)
import java.util.Scanner;
 
public class Main{
//找规律,依次能被3整除为不能,能,能,不能,能,能...,记为011011011
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int a = 0,b = 0,num = 0;  //a记前n个数有多少个1 ,b记前m个数有多少个1
        if(m % 3 == 0 || m % 3 == 1)  //能整除时011 011 即为2 * (m / 3)
            b = 2 * (m / 3);        //余数为1时011 011 0 int型m/3,忽略余数,也是2 * (m / 3)
        else
            b = 2 * (m / 3) + 1;
        
        if(n % 3 == 0){       //当前n个数的1包含第n位(余数为0或2)时,最后总数为b - a + 1
            a = 2 * (n / 3);   //前n个数的1不包含第n位(余数为1时)时,最后总数为b-a
            num = b - a + 1; 
        }            
        else
            if(n % 3 == 1){
                a = 2 * (n / 3);
                num = b - a;
            }
            else {
                a = 2 * (n / 3) + 1;
                num = b - a + 1;
            }       
        System.out.println(num);           
    }
 
}
发表于 2018-09-09 10:05:51 回复(0)
#include<stdio.h>
intmain()
{
    longintm,n,i;
      longintsum=0l;
    longinta=0;
    scanf("%ld%ld",&m,&n);
    if(m>n)
        return0;
    for(i=1;i<m;i++)
        sum=sum+i;
     
    for(i=m;i<=n;i++)
    {
        sum=sum+i;
       if(sum%3==0)
        a++;
    }
        printf("%ld",a);
}

发表于 2018-08-31 17:06:22 回复(0)
package tester0820; import java.util.Scanner; public class Main {     private long a;     private long b;          public Main(long a, long b){         this.a = a;         this.b = b;     }          @SuppressWarnings("resource")     public static void main(String[] args){         Scanner in = new Scanner(System.in);         long x = in.nextLong();         long y = in.nextLong();         Main m = new Main(x, y);         System.out.println(m.test());     }          public int test(){         if (a <= b) {             int count = 0;             for(long i=a; i<=b; i++) {                 if(i%3 != 1) {
                count ++;                 }             }             return count;         } else {             return 0;         }     } }

发表于 2018-08-20 12:33:46 回复(0)


import java.util.Scanner;

public class Main {
    static int func(int num) {
        int sum = 0;
        String temp = String.valueOf(num);
        for (int i = 0; i < temp.length(); i++)
            sum += temp.charAt(i) - '0';
        return sum;
    }

    static int p(int l, int r) {
        long sum = 0;
        int i = 0;
        int count = 0;
        for (i = 1; i < l; i++) {
            //sum += func(i);
            sum+=i;
        }
        for (; i <= r; i++) {
//            sum += func(i);
            sum+=i;
            if (sum % 3 == 0)
                count++;
        }
        return count;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sr = new Scanner(System.in);
        int l = sr.nextInt();
        int r = sr.nextInt();
        // int l=2,r=5;
        System.out.println(p(l, r));
    }

}

编辑于 2018-08-17 21:13:48 回复(0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
importjava.util.*;
publicclassMain{
    publicstaticvoidmain(String[] args){
        Scanner sc = newScanner(System.in);
        longa = sc.nextLong();
        longb = sc.nextLong();
        longcount = 0;
        longsum = 0;
        for(longk = 1; k <= a; k++){
                sum = sum + k;
            }
        if(sum % 3== 0){
            count++;
        }
        for(longr = a+1; r <= b; r++){
            sum = sum + r;
            if(sum % 3== 0){
                    count++;
                }
        }
        System.out.println(count);
    }
}

发表于 2018-07-11 22:53:36 回复(0)