ZOJ 1410 题解
题目链接:http://acm.zju.edu.cn/show_problem.php?pid=1410
又是一道简单题,以前做过一次,结果放弃了,今天看了一下,觉得还是比较简单于是下手了。
题目的大概意思是给出一个序列(发现ZOJ上面好多序列的题目啊),它的组成是这样的 11212312341234512345612345671234567812345678912345678910123456789101112345678910 就是先1,然后12,然后123,接着1234。。。。。123456789101112。。。。以此类推,要求给出一个数字i,输出在这个序列中第i个 数字是多少,注意不是第i个数,而是数字。
我的解法依旧很土,看到子序列的规律,数字的数量分别是1,2,3,4,5,6,7,8,9,11,13。。。。。。后面是因为出现了两位数,当然,这个 是一个部分等差数列,公差分别是1,2,3,4。。。。。,于是只要步步逼近就可以了。
送上代码,还是0.01s的。。。下次得做下优化。in C++
代码
1 #include<iostream>
2 using namespace std;
3
4 int digit_num(int n)
5 {
6 int c = 0 ;
7 while(n != 0)
8 {
9 c ++ ;
10 n /= 10;
11 }
12 return c ;
13 }
14
15 int nth_digit(int x , int n)
16 {
17 int temp = x;
18 int res ;
19 int num = digit_num(x);
20 num = num - n + 1;
21 while(num --)
22 {
23 res = temp % 10;
24 temp /= 10 ;
25 }
26 return res ;
27 }
28 int main()
29 {
30 int cur ;
31 int cases;
32 int n ;
33
34 cin>>cases;
35 while(cases --)
36 {
37 cin>>n;
38 cur = 0 ;
39 int sum = 0;
40 while(n - sum > 0)
41 {
42 cur ++ ;
43 sum += digit_num(cur);
44 n -= sum ;
45 }
46 if(n == 0)
47 n += sum ;
48 cur = 0 ;
49 while(n > 0)
50 {
51 cur ++ ;
52 n -= digit_num(cur);
53 }
54 n += digit_num(cur);
55 cout<<nth_digit(cur,n)<<endl;
56 }
57
58 return 0;
59 }
2 using namespace std;
3
4 int digit_num(int n)
5 {
6 int c = 0 ;
7 while(n != 0)
8 {
9 c ++ ;
10 n /= 10;
11 }
12 return c ;
13 }
14
15 int nth_digit(int x , int n)
16 {
17 int temp = x;
18 int res ;
19 int num = digit_num(x);
20 num = num - n + 1;
21 while(num --)
22 {
23 res = temp % 10;
24 temp /= 10 ;
25 }
26 return res ;
27 }
28 int main()
29 {
30 int cur ;
31 int cases;
32 int n ;
33
34 cin>>cases;
35 while(cases --)
36 {
37 cin>>n;
38 cur = 0 ;
39 int sum = 0;
40 while(n - sum > 0)
41 {
42 cur ++ ;
43 sum += digit_num(cur);
44 n -= sum ;
45 }
46 if(n == 0)
47 n += sum ;
48 cur = 0 ;
49 while(n > 0)
50 {
51 cur ++ ;
52 n -= digit_num(cur);
53 }
54 n += digit_num(cur);
55 cout<<nth_digit(cur,n)<<endl;
56 }
57
58 return 0;
59 }