小小度刷礼品——解题报告

描述:一年一度的百度之星又开始了,这次参赛人数创下了吉尼斯世界纪录,于是百度之星决定奖励一部分人:所有资格赛提交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;
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值