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

来源:互联网 发布:js中的while死循环 编辑:程序博客网 时间:2024/05/01 13:27

描述:一年一度的百度之星又开始了,这次参赛人数创下了吉尼斯世界纪录,于是百度之星决定奖励一部分人:所有资格赛提交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行,每行为对应的数据情况下,小小度得到的礼品数输入样例1888888888888888输出样例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;}}



原创粉丝点击