【2012 百度之星 / 初赛第一场 B:小小度刷礼品】

B:小小度刷礼品

时间限制: 
1000ms
 
内存限制: 
65536kB
描述

一年一度的百度之星又开始了,这次参赛人数创下了吉尼斯世界纪录,于是百度之星决定奖励一部分人:所有资格赛提交ID以x结尾的参赛选手将得到精美礼品一份。

小小度同学非常想得到这份礼品,于是他就连续狂交了很多次,提交ID从a连续到b,他想问问你他能得到多少份礼品,你能帮帮他吗?

输入
第一行一个正整数T表示数据组数;
接下来T行,每行三个不含多余前置零的整数x,a,b (0 <=x <= 10^18, 1 <= a,b <= 10^18,a <= b)
输出
T行,每行为对应的数据情况下,小小度得到的礼品数
样例输入
1
88888 88888 88888
样例输出

1

 1 #include <iostream>
 2 using namespace std;
 3 
 4 //////////////////////////////////////////////////////////
 5 // int CCalBit (int k)
 6 int CCalBit(int k)
 7 {
 8     int count = 0;
 9     while ( k )
10     {
11         count++;
12         k = k / 10;
13     }
14     
15     return count;
16 }
17 
18 //////////////////////////////////////////////////////////
19 // int CPowerTen(int k)
20 int CPowerTen(int k)
21 {
22     int sum = 1;
23     while ( k-- )
24     {
25         sum *= 10;
26     }
27     
28     return sum;
29 }
30 
31 //////////////////////////////////////////////////////////
32 // int CCalLeftStarter(int x, int num)
33 int CCalLeftStarter(int x, int num)
34 {
35     int result = num / CPowerTen(CCalBit(x));
36     
37     int temp = num % CPowerTen( CCalBit(x) );
38     
39     if (temp > x)
40     {
41         result++;
42     }
43     
44     return result;
45 }
46 
47 //////////////////////////////////////////////////////////
48 // int CCalRightEnder(int x, int num)
49 int CCalRightEnder(int x, int num)
50 {
51     int result = num / CPowerTen(CCalBit(x));
52     
53     int temp   = num % CPowerTen(CCalBit(x));
54     
55     if (temp < x)
56     {
57         result--;
58     }
59     
60     return result;
61 }
62 
63 int main()
64 {
65     int t;
66     cin >> t;
67     while ( t-- )
68     {
69         int x, a, b;
70         // input data
71         cin >> x >> a >> b;
72         
73         // process it 
74         int left_starter;
75             left_starter = CCalLeftStarter(x, a);
76         int right_ender;
77             right_ender = CCalRightEnder  (x, b);
78             
79         int result = right_ender - left_starter + 1;
80         
81         if (result < 0)
82         {
83             result = 0;
84         }
85         
86         cout << result << endl;
87         // output for test
88         
89     }
90     
91     return 0;
92 }
93 
94 // end 
95 // ism 
原文地址:https://www.cnblogs.com/ismdeep/p/2531728.html