描述:一年一度的百度之星又开始了,这次参赛人数创下了吉尼斯世界纪录,于是百度之星决定奖励一部分人:所有资格赛提交ID以x结尾的参赛选手将得到精美礼品一份。
小小度同学非常想得到这份礼品,于是他就连续狂交了很多次,提交ID从a连续到b,他想问问你他能得到多少份礼品,你能帮帮他吗?
输入
第一行一个正整数T表示数据组数;
接下去T行,每行三个正整数x,a,b (0 <=x <= 1018, 1 <= a,b <= 1018,a <= b)
输出
T行,每行为对应的数据情况下,小小度得到的礼品数
样例输入
1
88888 88888 88888
样例输出
1
解题报告:
两种方法解的,第二种方法更优。
第一种方法,回溯,具体看代码:
/*
* 题目描述
一年一度的百度之星又开始了,这次参赛人数创下了吉尼斯世界纪录,于是百度之星决定奖励一部分人:所有资格赛提交ID以x结尾的参赛选手将得到精美礼品一份。
小小度同学非常想得到这份礼品,于是他就连续提交了很多次,提交ID从a连续到b,他想问问你他能得到多少份礼品,你能帮帮他吗?
输入描述
第一行一个正整数T表示数据组数;
接下去T行,每行三个正整数x,a,b(0<=x<=1018,1<=a,b<=1018,a<=b)
输出描述
T行,每行为对应的数据情况下,小小度得到的礼品数
输入样例
1
888888888888888
输出样例
1
*/
import java.util.Scanner;
public class N25Gift {
int count;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
int[][] a = new int[t][3];
for(int i=0;i<t;i++){
for(int j=0;j<3;j++){
a[i][j]=sc.nextInt();
}
}
for(int i=0;i<t;i++){
N25Gift gif = new N25Gift();
gif.Calculate(a[i],"");
System.out.println(gif.count);
}
}
private void Calculate(int[] b,String result) { //递归各种情况
if(ReOk(result,b)==1){
count++;
}else if(ReOk(result,b)==-1){
return;
}
for(int i=0;i<=9;i++){
String temp=result;
result+=i;
Calculate(b,result);
result=temp;
}
}
private int ReOk(String result, int[] c) { //与结尾数字构成组合数字,判断是否满足要求
result+=c[0];
if(result.charAt(0)=='0'||Integer.parseInt(result)>c[2]){
return -1;
}else if(Integer.parseInt(result)>=c[1]&&Integer.parseInt(result)<=c[2]){
return 1;
}else{
return 0;
}
}
}
第二种方法:
import java.util.Scanner;
public class N25Gift2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while(T--!=0){
int x = sc.nextInt();
int a = sc.nextInt();
int b = sc.nextInt();
int len_x = new String(""+x).length();
if(a<x){
a=x;
}
int count=0;
int mid = fun(len_x);
for(int i=a;i<=b;i++){
if((0==(i-x)%mid)){
count++;
}
}
System.out.println(count);
}
}
private static int fun(int n) {
int sum=1;
while(n-->0){
sum*=10;
}
return sum;
}
}