从1到1000000的所有自然数,数字“1”一共出现了多少次?例:自然数101中,数字“1”出现了2次,自然数1011中,数字“1”出现了3次,请写明计算过程及结果。

2 2 收藏


直接登录
最新评论
  • mah0gany   2016/01/23

    “`python
    def foo(number):
    num_dict = {}
    map(lambda x: num_dict.update({int(x): 1 if int(x) not in num_dict else num_dict[int(x)]+1}), str(number))
    return num_dict

    if __name__ == ‘__main__’:
    print foo(101010101012)
    “`

  • 树莓学生 学生一枚 2016/01/24

    难道不是一道数学题:求000001到1000000的所有自然数,数字“1”一共出现了多少次?

  • Mr.li   2016/01/25

    小学奥数题

  • 1~10^k中1出现的个数就是k*10^(k-1) + 1
    真·小学题。。。

    • warboy   2016/01/25

      你应该理解错了吧,意思应该是给你一个范围内的数字,数字中1的个树有几位

  • sdkl   2016/01/25

    1+c(6,1)*1*9^5 + c(6,2)*2*9^4 +c(6,3)*3*9^3 + c(6,4)*4*9^2 + c(6,5)*5*9^1 + c(6,6)*6*9^0
    = 1+ 354294 + 196830 + 43740 + 4860 + 270 + 6 = 600001
    不知道算得对不对,手好冷。。。

  • fk攻城狮   2016/01/25

    java解法

    int ones = 0;
    for(int i = 1 ;i <= 1000000 ;i++ ){
    ones += String.valueOf(i).replaceAll("[^1]","").length();
    }
    System.out.println(ones);

    • 偏偏遇上你 软件开发 2016/01/29

      这个也不对啊,replaceAll方法返回是替换之后的字符串,比如说数字1101,替换之后,得到的是字符0,得到的长度是1,你就只加了一次,但是实际上人家是有三次

    • 偏偏遇上你 软件开发 2016/01/29

      看错了,是把不等于1的替换掉,这样是对的

  • fcb_jay   2016/01/25

    int n = 0;
    for(int i = 1;i < 1000000;i++){
    if(String.valueOf(i).contains("1"))
    n++;
    }

  • gaplee   2016/01/26

    // @mah0gany C语言解也不见得很复杂。

    #include
    int count_one(unsigned int num)
    {
    int cnt = 0;
    while(num){
    if( 1 == num%10 ){
    cnt++;
    }
    num = num/10;
    }
    return cnt;
    }

    int main(void)
    {
    int i, sum=0;
    for(i=0; i<=1000000; i++){
    sum += count_one(i);
    }
    printf("Result: %d\n", sum);
    return 0;
    }

  • Benn   2016/01/26

    10^5*6+1

  • 破晓   2016/01/26

    分类讨论, 个位的一, 十位的一, …. 以此类推
    每当有一个10出现, 就会有一个 个位 的一(1, 11 ,21 …), 每当有一个一百出现就会有10个 十位的 一(10, 11, 12, 13…19) 注意11 的个位一已经计算过。最后算下来都是十分之一的比率, 再加上最后一个一百万的1就是100 0000 * 6/10 + 1。
    楼上的算法有点复杂, 一般不好接受

  •   2016/01/26

    int sum=0;
    for (int a=0; a<1000000; a++) {
    NSString *str=[NSString stringWithFormat:@"%d",a];
    for (int a=0; a<str.length; a++) {
    if ([[NSString stringWithFormat:@"%c", [str characterAtIndex:a]] isEqualToString:@"1"]){
    sum++;
    }
    }
    }
    NSLog(@"%d",sum);
    600000个1

  • 微笑   2016/01/26

    var counter = 0;
    var jStr;
    var aChar;
    var num = new Array();
    for (var j = 1; j < 1000000; j++) {
    jStr = j.toString();
    for (var i = 0; i < jStr.length; i++) {
    aChar = jStr.charAt(i);
    if(aChar=='1'){
    counter=counter+1;
    }

    }

    }
    alert(counter)
    }

    js一些了下,貌似有600000个1吧

  • balaaa   2016/01/28

    php解法

    $allcount = 0;
    for($i=1;$i<=1000000;$i++){
    $count = substr_count((string)$i,'1');
    $allcount += $count;
    }

    echo $allcount;

  • 天海   2016/01/28

    方法多种

  • 王先生 学生 2016/01/29

    答案为600001个
    理由如下:
    从数字1-999999,每一个位上1出现的次数都是100000次,由于有六位所以有600000个,再加上1000000中的一个1,所以最后从1-1000000一共有600001个1,用程序的话也可以解出来,但应该这种解法更好,再说了现场哪有编译器哈哈。仅供参考,大家有什么更好的方法的话可以提出来一起交流啊

  • .net写法,60001个
    int count = 0;
    for (int i = 0; i <= 1000000; i++)
    {
    MatchCollection mc = Regex.Matches(i.ToString(),"1");
    count = count + mc.Count;
    }

  • Coder_SLM   2016/01/29

    总觉得这是一道概率题。考虑从000000,000001,000002,…,一直到999999,总共600万个字符。其中每个字符[0,1,…,8,9]都是均匀分布的,出现次数相同。所以1一共出现了600/10=60万次。然后再加上1000000中的1,所以一共出现了600001次。

    不知道对否。

  • 编程之美中出现过, 不过 见识了一种更加巧妙的方法啊, 涨姿势了