首页 > 试题广场 >

数码

[编程题]数码
  • 热度指数:887 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定两个整数 l 和 r ,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求1~9每个数码出现的次数。

输入描述:
一行,两个整数 l 和 r (1 ≤ l ≤ r ≤ 10^9)。


输出描述:
输出9行。
第 i 行,输出数码 i 出现的次数。
示例1

输入

1 4

输出

4
2
1
1
0
0
0
0
0
function sol(a, b) {
    var ret = [0,0,0,0,0,0,0,0,0];
    for(let i=a; i<=b; i++) {
        iter(i, ret);
    }
    return ret;
}

function iter(x, ret) {
    var num1;
    var num2;
    for(let i=1; i*i<=x; i++) {

        if(x % i == 0) {
            num1 = i;
            num2 = x/i;
            while(num1/10 >= 1){
                num1 = Math.floor(num1/10);
            }
            if(num2 != num1){
                while(num2/10 >= 1){
                    num2 = Math.floor(num2/10);
                }
                ret[num2-1] += 1;   
            }
            ret[num1-1] += 1;
        }
    }
}

var data = readline().split(' ');
var a = parseInt(data[0]);
var b = parseInt(data[1]);
var result = sol(a,b);
for(let i=0; i<9; i++) {
    print(result[i]);
}

相对于暴力遍历,这里面我只加了

for(let i=1; i*i<=x; i++)

这一个优化,应该时间复杂度可以到 o(n√n)的,但是结果出错,32-8300的例子,返回的数字不对,有没大神帮我看下我哪里出了bug?只是缩小了一下遍历范围呀。

发表于 2018-03-27 23:04:20 回复(0)

热门推荐

通过挑战的用户