小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。
输出一个整数, 表示区间内能被3整除的数字个数。
2 5
3
12, 123, 1234, 12345...
其中12, 123, 12345能被3整除。
package com.shengxi.niuke; import java.util.Scanner; public class Day006 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int l = scan.nextInt(); int r = scan.nextInt(); int cnt = 0; for(int i=l;i<=r;i++) { if(i%3!=1) { cnt++; } } System.out.println(cnt); } }
public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ int l = in.nextInt(); int r = in.nextInt(); if(r<l){ throw new RuntimeException(); } int count = 0; for(int i = l; i<=r; i++){ long num = getNum((long)i); if(num % 3 == 0){ count++; } } System.out.println(count); } } private static long getNum(long num){ String str = ""; for(int i = 1; i<=num; i++){ str = str+i; } long res = Integer.valueOf(str); return res; } }
不太懂题的意思,我以为直接求两个数中可以整除3的个数和。写出来也通过了。看评论区发现自己想的有些简单
import java.util.Scanner; public class Main{ public static void main(String[] args){ /** left right 边界 里面能整除3的个数,只需要对边界值判断即可。 如果 left 可以整除3 说明左边界包括一个 。 只需要right包括的3的个数 - left 包括的 + 1 如果左边界不是 上式不用 + 1即可。 */ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int l = sc.nextInt(); int r = sc.nextInt(); System.out.println(l % 3 == 0 ? r / 3 - l / 3 + 1 : r / 3 - l / 3); } } }
找到这个数列的规律就可以了,就是1,2,3,4,5,6,7,8,9,10,11,12,13,14……字符串拼接,第几个数就拼接几次
import java.util.*; public class Main { public static void main(String [] args) { Scanner sc=new Scanner(System.in); while(sc.hasNextInt()) { int a=sc.nextInt(); int b=sc.nextInt(); System.out.println(getResult(a,b)); } } public static int getResult(int a,int b) { int count=0;//计数器 for(int i=a;i<=b;i++) { if(getNum(i)%3==0) { count++; } } return count; } public static long getNum(int index) { StringBuilder sb=new StringBuilder(); for(int i=1;i<=index;i++) { sb.append(""+i); } String str=sb.toString(); long num=Long.parseLong(str); return num; } }
import java.util.Scanner; // import java.math.BigInteger; public class Main { public static void main(String[] args) { // 据观察,序列满足×√√×√√×√√×√√... // 该题right并不超过int类型,2^31 - 1 > 2*10^9 // 如果超过整型范围,用BigInteger来计算 Scanner scan = new Scanner(System.in); int left = scan.nextInt(); int right = scan.nextInt(); if(left == 1) System.out.print(getNumbers(right)); else System.out.print(getNumbers(right) - getNumbers(left - 1)); scan.close(); } public static int getNumbers(int x) { // 也就是求getNumbers(1, right) - getNumbers(1, left) return ((x/3) << 1) + (x % 3 > 1 ? 1 : 0); } // static BigInteger two =new BigInteger("2"); // static BigInteger three =new BigInteger("3"); // public static void main(String[] args) { // Scanner scan = new Scanner(System.in); // BigInteger left = scan.nextBigInteger(); // BigInteger right = scan.nextBigInteger(); // if(left.compareTo(BigInteger.ONE) == 0 ) // System.out.print(getNumbers(right)); // else // System.out.print(getNumbers(right).subtract(getNumbers(left.subtract((BigInteger.ONE))))); // scan.close(); // } // // public static BigInteger getNumbers(BigInteger x) { // // 也就是求getNumbers(1, right) - getNumbers(1, left) // return ((x.divide(three)).multiply(two)).add(new BigInteger(String.valueOf((x.mod(three)).compareTo(BigInteger.ONE) > 0 ? 1 : 0))); // } }
import java.util.Scanner; //每连续三个数中必有两个数能被三整除,先算出一共有多少组3个数 //再分别判断余下的1或2个数中有几个3的倍数 //从1开始,分布规律为 NYYNYYNYY... //N代表不是3的倍数,Y代表是3的倍数 public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); while(input.hasNext()){ int l = input.nextInt(); int r = input.nextInt(); System.out.println(Solution(l, r)); } input.close(); } public static int Solution(int l, int r) { if(l > r) return 0; else if((r + 1 - l)%3 == 0) return (r + 1 - l)/3 * 2; else if((r + 1 - l)%3 == 1) return (r + 1 - l)/3 * 2 + ((r%3 == 1) ? 0 : 1); else return (r + 1 - l)/3 * 2 + ((r%3 == 0) ? 2 : 1); } }
import java.util.*; public class Main{ //参考一位大神的数学归纳法:在区间[1 , x]***有f(x) = (x+2)/3个不能被整除的,其余的全能被整除 //那么区间[l , r]***有数字r-l+1个,其中存在不能整除的个数是f(r)-f(l-1)个 //那么最后能被整除的个数就是 r-l+1-(f(r)-f(l-1))个 public static void main(String[] args){ Scanner sc = new Scanner(System.in); int l = sc.nextInt(); int r = sc.nextInt(); System.out.println(r - l + 1 - (r + 2) / 3 + (l - 1 + 2) / 3); } }
import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner input=new Scanner(System.in); int l,r,count=0; l=input.nextInt(); r=input.nextInt(); int yushu=0; int value=0; StringBuffer str=new StringBuffer(); //最左边的数是否是3的倍数 for(int j=1;j<=l;j++){ str.append(String.valueOf(j)); value+=Integer.parseInt(str.substring(j-1, j)); } yushu=value%3; if(yushu==0){ count++; } //后面的数用前面的余数加此时最后一位数取余数判断是否是3的倍数 for(int i=l+1;i<=r;i++){ yushu=(i+yushu)%3; if(yushu==0){ count++; } } System.out.println(count); } }
import java.io.BufferedInputStream; import java.util.Scanner; public class Main { static int min = Integer.MAX_VALUE; public static void main(String[] args) { Scanner cin = new Scanner(new BufferedInputStream(System.in)); int l = cin.nextInt(); int r = cin.nextInt(); System.out.println(r *2/3 - (l-1)*2/3); } } 1-x 被3整除个数为x*2/3
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int l = sc.nextInt(); int r = sc.nextInt(); System.out.println(cal(r) - cal(l - 1)); } } private static int cal(int n) { int sum = n / 3 * 2; if (n % 3 == 2) return sum + 1; else return sum; } }首先得找到规律,我们可以发现1,12,123这种,
否 | 是 | 是 |
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); long m = scanner.nextInt(); long n = scanner.nextInt(); if ((m % 3 == 1 && n % 3 == 1)||(m % 3 == 1 && n % 3 == 2) ){ System.out.println(n - m - (n - m + 1) / 3); } else { System.out.println(n - m + 1 - (n - m + 1) / 3); } } }
for(int index = l;index<=r;index++){ int num = 0; for(int i=1;i<=index;i++){//根据三的倍数的性质,如果各位相加能够整除3就是3的倍数。 num = num+i; } System.out.println(num%3); //用这种方法先试着输出一下num%3的余数,可以发现从1-20分别按100100100...这种顺序 }因此,根据该规律,直接对需要求的数取余即可,若余数为2或者0则对应的数为3的倍数。
import java.util.Scanner; public class Main{ public static void main(String[] arg){ Scanner scan = new Scanner(System.in); int l = scan.nextInt(); int r = scan.nextInt(); if(l>=r){ System.out.println(0);//判断左右区间是否合法 }else{ int count = 0; for(int index = l;index<=r;index++){ if(index%3==2||index%3==0) count++; } System.out.println(count); } } }
import java.util.Scanner; public class Main { public static int sum(int i){ return i/3*2+(i%3==2?1:0); } public static void main(String[] args){ Scanner input = new Scanner(System.in); int l = input.nextInt(); int r = input.nextInt(); System.out.println(sum(r) - sum(l-1)); } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); //起始位置 int l=in.nextInt(); //结束位置 int r=in.nextInt(); //1 0 0 1 0 0 .... int sum=0; if(l>=1 && l<=r && r<=1e9){ //根据规律进行判断,当l处于1 0 0中1号位与三号位时情况相同 if (l%3==1 || l%3==0){ sum=(r-l)-((r-l)/3); } //处于二号位时需要进行特殊的运算 if (l%3==2){ if (r-l==1){ sum=2; }else{ sum=(r-l)-((r-l-2)/3); } } System.out.println(sum); }else{ System.out.println("输入错误"); } } } //无需循环,只要找到相应规律即可