Codeforces Round #308 (Div. 2) B. Vanya and Books

原题:http://codeforces.com/contest/552/problem/B


题目大意: 给个数字n, 求这n个数字的digits个数的合


分析: 比如1234, digit是1的区间是[1,9], 一共9个, 2的区间是[10,99]一共90*1个digit, 3的区间是[100,999]一共900*2个digit, n的区间是[10^n,10^(n+1)-1]一共10^(n+1) – 10^(n)*(n-1)个digit. 那么1234 落在区间4, [1000,9999]中. 可以用1234-1000+1得到4个digit的数字的个数, 然后乘以4,得到digit为4的digit数, 然后与前边的区间的合相加, 就是答案

第一次写:

 public void solve(int testNumber, InputReader in, OutputWriter out) {
            long n = in.readLong();
            long t = n;
            long res = 0;
            int digits = 1;
            while (n / 10 != 0) {
                res += (9 * Math.pow(10, digits - 1)) * digits;
                digits++;
                n /= 10;
            }
            res += (t - Math.pow(10, digits - 1) + 1) * digits;
            out.print(res);

        }

第二次写:

public void solve(int testNumber, InputReader in, OutputWriter out) {
        long n = in.readLong();
        long res = 0;
        int digits = 1;
        while (true) {
            double up = Math.pow(10,digits)-1;
            if (n > up)
                res += (9*Math.pow(10,digits-1)) * digits;
            else {
                res += (n - (Math.pow(10,digits-1))+1) * digits;
                break;
            }
            digits++;
        }
        out.print(res);
    }