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 }


posted on 2010-02-05 01:50  vivy  阅读(363)  评论(0编辑  收藏  举报