统计1-N的1的个数------递归尝试

 准备用递归做, 前109通过, 后面的不行了, 代码的复杂度太大,违背代码应该简单明了的原则。

 

 

<script>
 //alert('0'.substr(1) === '');

 function count_1_from_1_to_N(N, index) {
  
  var first_char = N.substr(index,1); 
  var last_N = N.substr(index+1); 

  if (N == 0) {
   return 0;
  } else if (N < 0) {
   N = N * -1
  } else if (N < 10) {
   return 1;
  }
    

  if (last_N === '') {
   return 1;
  }

  if (first_char == 0) {
   return 0;
  }

  //alert("first_char : " + first_char);
  //alert("last : " + last_N);

  var value = 1 +  (first_char==1?(last_N-(-1)):0) + 1;
  // alert(value);
  //alert(first_char * sign((""+last_N).charAt(0)));
  var count = 0;

  var middle_count = 0;
  var last_left_str = last_N.substr(0, last_N.length-1);
  
  for (var i=0; i<last_left_str.length; i++) {
   if (last_left_str.charAt(i) == '1') {
    middle_count ++;
    alert(last_left_str);
   }
  }
  count = (N.length-index-1) * Math.pow(10, N.length-index-2) * first_char + sign(first_char-1)*Math.pow(10, N.length-index-1) + (first_char==1?(last_N-(-1))*(1+middle_count):0);// +  first_char * sign(last_N.charAt(0));
  //alert(count);
  return count + count_1_from_1_to_N(last_N, index+1);

        }

 function sign(n) {
  return n < 0 ? -1 : (n > 0 ? 1 : 0);
 }

 /*var N_arr = [1,3,9,10,11,12,13,14,15,16,17,18,19,20,21,22,30,31,32,40,41,42,50,51,60,61,70,71,80,81,90,91,100, 101,102,110,111,112, 1000, 10001, 10010, 10011,100112];

 for (var i =0; i<N_arr.length; i++) {
  //alert(N_arr[i]);
  var count = count_1_from_1_to_N(""+N_arr[i], 0);
  alert(N_arr[i] + " : " + count);
 }
*/
 var all_str = "";
 for (var i =0; i<122; i++) {
  //alert(N_arr[i]);
  all_str = all_str + i;
  var count_right = 0;
  for (var j=0; j<all_str.length; j++) {
   if (all_str.charAt(j) == '1') {
    count_right ++;
   }
  }
   
  var count = count_1_from_1_to_N(""+i, 0);

  if (count != count_right) {

   alert(i + " : " + count + " == " + count_right);
  }
  //alert(i + " : " + count + " == " + count_right);
 }
 

</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值