百数表规律以及解题。

小学一年级学习了百数表。百数表在解题中非常有作用。首先我们要整理出来百数表数字规律。

图1 从图一看出:

  • 从0-99,1-9这9个数字每个出现了20次,0出现了10次。

图2

从图二看出:

  • 如果给1-9这9个个位数每一个数字前面补一个0,那么在数表中,0-9每个数字出现的次数都是一样的,都是20次。

图3

从图3看出:

  • 数表被对角线,0-11-22-33-...-99分为2部分。对角线上方的数字个位数字比十位数字大。

典型题解

    1. 50以内的两位数,个位数比十位数大的有几个?

利用百数表求解

图4

1+2+3+4+5+6+7+8= 36

    1. 100以内的数字所有数位相加求和
  • 所谓数位相加,指每一位分别相加。例如10,11两个数数位相加就是1+0+1+1=3
  • 按照上面的总结,如果给1-9这9个个位数每一个数字前面补一个0,那么在数表中,0-9每个数字出现的次数都是一样的,都是20次。
  • 所以100以内的数字所有数位相加求和就是20个1-9求和。1-9数字求和为45
  • 最后:20X(1+2+3+4+5+6+7+8+9+0) = 900
    1. 1到2008的每个数字的所有数位相加的和是多少?

图5

  • 与上题类似,我们先看一下100-199的情况,发现与图一相比,数位多了1,那么100-199数位求和与0-99数位求和相比,就是多了100个1
  • 以此类推200-299数位求和,多了100个2
  • ...
  • 900-999数位求和,多了100个9
  • 所以0-999数位求和就是900 + (900+100) + (900+200) + ... + (900+900)= 9000 + 100X(1+2+3+4+..+9)= 9000+4500 =13500
  • 1000-1999求和,比0-999数位求和多了1000个1,所以1000-1999数位求和就是13500+1000=14500
  • 2000-2008数位求和= 2x8 + 1+2+3+4+5+6+7+8 = 16+36 = 52
  • 最终结果是13500+14500+ 52 = 28052

另外一种解法:

  • 从上述如果给1-9这9个个位数每一个数字前面补一个0,那么在数表中,0-9每个数字出现的次数都是一样的,都是20次。
  • 我们发现这个规律放到0-99也是一样的,如果把0-99每个数字前面补0,那么000-999,每个数字出现的次数是一样的,一共3000个数字,0-9分别出现了300次,所以0-999数位求和就是300x45=13500
  • 1000-1999求和,比0-999数位求和多了1000个1,所以1000-1999数位求和就是13500+1000=14500
  • 2000-2008数位求和= 2x9 + 1+2+3+4+5+6+7+8 = 18+36 = 54
  • 所以最终结果是13500+14500+ 54 = 28054

数位相加的程序解法

非递归解法

function sum(number) {
  var  s=0;
  for(digits=0;digits<=number;digits++){
    tmp = digits;
    do{
        s+=tmp%10;
    }while(tmp=parseInt(tmp/10));
  }
   return s;
}
1
2
3
4
5
6
7
8
9
10

递归解法

function sum(digits){
  if(digits<9){
    return digits;
  }else{
    return digits%10 +" + " + sum(parseInt(digits/10));
  }
}
function sumAll(digits){
    var s=0;
    for(var i=0;i<=2008;i++){
        s = s+sum(i);
    }
    return s;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14