论坛首页 编程语言技术论坛

统计0到n的所有数字中1出现的次数

浏览 12678 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-04-23  
思路:先把所有的数字拼接成为一个大字符串,然后统计这个字符串中1出现的次数。
具体代码如下:

require 'test/unit'

class TestCountN < Test::Unit::TestCase

  def test
    assert_equal 6, count(13)
  end

end

def add_all_number_to_str n
  str = ""
  for i in 1..n
    str += i.to_s
  end
  str
end

def count n
  c = 0
  add_all_number_to_str(n).each_char {|x| c=c+1 if(x.to_i)==1}
  c
end
   发表时间:2013-04-23  
str.scan(/1/).length
0 请登录后投票
   发表时间:2013-04-23  
caoshengbin 写道
str.scan(/1/).length

这个更加简洁~~~ 厉害~~~
0 请登录后投票
   发表时间:2013-04-26  
bxp2012 写道
caoshengbin 写道
str.scan(/1/).length

这个更加简洁~~~ 厉害~~~

这个是什么语言?
0 请登录后投票
   发表时间:2013-04-27  
如果有数字11那是不是要算2次?
0 请登录后投票
   发表时间:2013-04-28  
lohasle 写道
bxp2012 写道
caoshengbin 写道
str.scan(/1/).length

这个更加简洁~~~ 厉害~~~

这个是什么语言?


ruby
0 请登录后投票
   发表时间:2013-04-28   最后修改:2013-04-28

这样子性能会很差的。。如果数据量足够大的话,这里会用到一些统计分析的内容

n=9时,1的次数是 1

n=99时,1的次数是 2*10^1= 20

n=999时,1的次数是  3*10^2=300

n=9999时,1的次数是 4*10^3 = 4000

这是一些统计规律,剩下的就还要思考了

比如给一个数是12 345 679,那么该题目可分解为计算 10 000 000-12 345 679中间1的个数 + 7 * 10^6,然后继续。。。这个有点复杂,没完全想清楚。。使用了递归的算法,然后使用double存储,防止溢出

代码如下:

import java.math.*;
public class computeFrequent {	
	private static double comp(String n)
	{		
		if(n.length() <=1){
			if(n.equals("0")) {return 0;}else { return 1;}
		}

		int x=n.length();  // --n的长度
		int y = Integer.parseInt(n.substring(0,1));  //--n最左边一位
		double lz = Double.parseDouble(n.substring(1,x));//--n去除第一位
		String z = n.substring(1,x);
		while(z.substring(0,1).equals("0") && z.length() > 1){
		   z = n.substring(1,z.length());//---去左零		
		}
		if(y == 1){
		  return (x-1)*Math.pow(10, x-2) + lz+1 + comp(z);  //递归
		}
		else{
		  return (x-1)* Math.pow(10, x-2) * y + Math.pow(10, x-1) + comp(z);
		}
		
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		for(long i = 0; i<1000;i++)
		{
			System.out.println("I=" + String.valueOf(i) + ",comp=" + String.valueOf(comp(String.valueOf(i))));
		}
		
	}

}

 

 

0 请登录后投票
   发表时间:2013-04-28  
lz没说交代清楚,11、112这样的怎么算呢?
0 请登录后投票
   发表时间:2013-04-28  
chyanog 写道
lz没说交代清楚,11、112这样的怎么算呢?

算2个1
0 请登录后投票
   发表时间:2013-04-28  
  • 大小: 10.2 KB
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics