这样子性能会很差的。。如果数据量足够大的话,这里会用到一些统计分析的内容
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))));
}
}
}