谁能写一个程序实现如题,力求效率要高,可读性强.

解决方案 »

  1.   

    C1-1
    C2-1 C2-2
    C3-1 C3-2 C3-3
    都是概率问题, 这个可以一直做下去。
    2008080808 = 
    2000000000
       8000000
           800
             8
      

  2.   

    小弟刚学帮个月不到  不会楼上几位的高级方法
    愚见如下累加器
    for循环1到2008080808
        转换为字符串,
        查找字符串内是否有7
        如果找到累加器++
      

  3.   

    00..00 - 99..99假设有n位 
    则总共有n*10^n个数字 其中非零的数均占1/10
      

  4.   

    最终结果:
    2*9*10^8 + (8*6*10^5 + 10^6)+ (8*4*10^3 + 10^4) + (8*2*10^1 + 10^2) + 1 = 1,805,842,261可以部分检验 
    long count = 0;
    for (long i = 0; i <= 80808; i++) {
        System.out.println(i);
        for (int j = 0; j < String.valueOf(i).length(); j++) {
            if (i / (int)Math.pow(10, j) % 10 == 7) {
        count++;
    }
        }
    }
    System.out.println(count); //42261
      

  5.   

    首先将所有数字变换成StringBuffer 的对象,并且用查找的方式看是否有“7”这个字符使用indexOf(String s)方法假如方法的返回值不等于-1则把此数假如到累加器数组中(一定是长整形)。
      

  6.   

    public class Test {
    public static void main(String[] args) {
    //例子
    System.out.println(22%7);
    System.out.println(22-(22%7));
    System.out.println((22-(22%7))/7);
    //所以
    System.out.println((2008080808-(2008080808%7))/7); }
    }
      

  7.   

    刚刚理解错了 重来public class Test {
    public static void main(String[] args) {
    //  System.out.println(Math.random()*10);
    int i1 =2008080808/10+1; //每10中就有1个7
    int i2 =2008080808/100; //每100中就有一个70 也是就多1
    //....递推
    //所以
    Long y = new Long(2008080808);
    Long x = new Long(1);
    Long i=new Long(10);
    while( i<=y){
    System.out.println(y/i);
    x = x+(y/i);
    i = i*10;
    }
    System.out.println(x);
    }
    }
      

  8.   

    public class Face { /**
     * @param args
     */
    public static void main(String[] args) {
    Integer a=new Integer(2008080808);
    int flag=10;
    int result=0;
    for(int i=0;i<a.toString().length();i++){
    System.out.println(result);
    result+=a/flag+1;
    flag=flag*10;

    }
    System.out.println(result);
    }}
      

  9.   

    修改一下:
    public class Face { /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
    Integer a=new Integer(2008080808); 
    int flag=10; 
    int result=0; 
    for(int i=0;i <a.toString().length()-1;i++){ 
    System.out.println(result); 
    result+=a/flag+1; 
    flag=flag*10; } 
    System.out.println(result); 
    } }
      

  10.   

    其实就是0-99共有2*100个数字(10以内的按照01,02,..09记),每个数字出现的次数是一样的,所以会有2*100/10=20个7.
    0-999同理,注意不足三位的高位以0补齐,所以说如果是计算"0"的个数的话,稍微复杂一些了.
    再就是,级数一样的数字比如100-199之间包含"7"的数字和200-299之间包含"7"的数字是一样多的,但700-799则会别它们多100个,也即"级数"个.有兴趣的朋友可以去编写java code试试看,效率可能是最高的了.
      

  11.   

    这个是个数学题:
     这可以分区间解决
    1> 100 -> 0,10,20,30,40,50,60,70,80,90,100
      十个区间:1 ,1 ,1 ,1 ,1 ,1 ,1 ,10,1, 1 = 1*9+10 = 19
    2> 1000 -> 0,100,200,300,400,500,600,700,800,900,1000
      十个区间: 19,19 ,19 ,19 ,19 ,19 ,19, 100,19 ,19 = 19*9+100 = 271
    3> 10000 -> 0,1000,2000,3000,4000,5000,6000,7000,8000,9000,10000
       十个区间: 271, 271 ,271 ,271, 271, 271, 271, 1000, 271, 271 = 271*9+1000
    假设待求数Z,一定是10,100,1000,10000等,10的指数,有以下公式:
    Z = 1*10^n;
    P(n) = 9*P(n-1) + 1*10^(n-1);解答:
    2,000,000,000  ->0,1000000000,2000000000   
        用上面公式,可得出这2个区间的值
    8,000,000      -> 0,1000000,2000000,3000000,4000000,5000000,6000000,7000000,8000000
        用上面公式,可得出这2个区间的值,但要记得7000000,8000000之间为1000000个
    800            ->0,100,200,300,400,500,600,700,800
        同上

        为1
    把上述加总,我们不难的出答案.PS:这里我只证明了10^n的情况下的公式,如果谁可以证明一个通用的公式,我们就可以直接得出答案了.
       期待中...
      

  12.   

    答案来了,public class MyArt {    public static long getNumberOf(int n) {
            if (n == 0) 
                return 0;
            
            long p1 = 0;
            long p2 = 1;
            for (int i = 0; i < n-1; i++) {
                p2 = p2 * 10;
            }        p1 = (9 * getNumberOf(n - 1));
            
            return p1 + p2;
        }
        
        public static void main(String[] args) {
            System.out.println("--------Test--------");
            System.out.println(getNumberOf(1));
            System.out.println(getNumberOf(2));
            System.out.println(getNumberOf(3));
            System.out.println(getNumberOf(4));
            System.out.println(getNumberOf(5));
            System.out.println(getNumberOf(6));
            System.out.println(getNumberOf(7));
            System.out.println(getNumberOf(8));
            System.out.println(getNumberOf(9));
            System.out.println(getNumberOf(10));
            
            System.out.println("-------Results-----");
            long r1,r2,r3,r4,r5;
            r1 = getNumberOf(9)*2;
            r2 = getNumberOf(8)*2;
            r3 = getNumberOf(6)*7 + 1000000;
            r4 = getNumberOf(2)*7 + 100;
            r5 = 1;
            System.out.println(r1+r2+r3+r4+r5);
            System.out.println("-------Results----");
        }
    }运行结果:
    --------Test--------
    1
    19
    271
    3439
    40951
    468559
    5217031
    56953279
    612579511
    6513215599
    -------Results-----
    1343345727
    -------Results----
      

  13.   

    sorry,刚才得意忘形了。
    继续我上面的思路:
    2*9^9是0 - 2*10^9 内无7的个数;   (包括0)
    7*9^6是0 - 8*10^6 内无7的个数;
    7*9^4是0 - 8*10^4 内无7的个数;
    7*9^2是0 - 8*10^2 内无7的个数;
    7*9^0是0 - 8*10^0 内无7的个数;则2*10^9-2*9^9是0 - 2*10^9 内含7的个数 设为a9;   
    8*10^6-7*9^6是0 - 8*10^6 内含7的个数 设为a6;
    8*10^4-7*9^4是0 - 8*10^4 内含7的个数 设为a4;
    8*10^2-7*9^2是0 - 8*10^2 内含7的个数 设为a2;
    8*10^0-7*9^0是0 - 8*10^0 内含7的个数 设为a0;利用抽屉原理:
    则0 至 2*10^9+8*10^6+8*10^4+8*10^2+8*10^0=2008080808 内含7的个数为:
    a9+a6-a4+a2-a0 = (2*10^9-2*9^9) + (8*10^6-7*9^6) - (8*10^4-7*9^4) + (8*10^2-7*9^2) - (8*10^0-7*9^0) = ?System.out.println(  (2*Math.pow(10,9)-2*Math.pow(9,9))
    +(8*Math.pow(10,6)-7*Math.pow(9,6))
    +(8*Math.pow(10,4)-7*Math.pow(9,4))
    +(8*Math.pow(10,2)-7*Math.pow(9,2))
    +(8*Math.pow(10,0)-7*Math.pow(9,0))
      );打印结果为:1.229473242E9
      

  14.   

    回复太快!如果你是恶意刷楼,将会受到严厉惩罚!——我不是恶意的!意?我怎么把减号也写成加号了??粗心大意,怪不得当年考上级没及格。System.out.println(  (2*Math.pow(10,9)-2*Math.pow(9,9))
                                +(8*Math.pow(10,6)-7*Math.pow(9,6))
                                -(8*Math.pow(10,4)-7*Math.pow(9,4))
                                +(8*Math.pow(10,2)-7*Math.pow(9,2))
                                -(8*Math.pow(10,0)-7*Math.pow(9,0))
                              );打印结果为:
    1.229405094E9
      

  15.   

    效率最低的两种解法:
    代码一错误
    代码二正确
    #include <stdio.h>
    int main()
    {
    long int count=0,cmp,value,tmp=0;
    long int test=0xf;
    for(value=0;value<=20;value++)
    {
    for(cmp=7;cmp<=value;cmp*=10)
    {
    if(((value-cmp)&test)==0x0)
    tmp=1;
                    test<<=4;
    }
    if(tmp==1)
      {
    ++count;
    }
    tmp=0;
    test=0xf;
    }
    printf("There are %ld value contain the number 7\n",count);
    return 0;
    }#if 0
    /**********************************************
    *别人做的算法
    **********************************************/
    #include <stdio.h>
    int n=200808;
    int main(int argc,char **argv)
    {
    int num=0;
    int a=0,i;
    for(i=0;i<=n;i++)
    {
    a=i;
    while(a>0)
    {
    if(a%10==7)
    {
    num++;
    break;
    }
    a=a/10;
    } }
    printf("%d\n",num);
    return 0;
    }
    #endif
      

  16.   


    /**
     * 100内含有7的数字为:除了70-79以外,为10个,其他X0-X9中的都一样,为1个
     * 同理 1000内,除了700-799为100个,其他的X00-X99含有数字7的个数都和0-100以内含有数字7的个数一样。
     * 以此类推,将一万分为9*(1千以内含7的数字个数) 与 另外一个1千(7000-7999),十万分为9*(1万内含有7的数字个数) 和另外一个 1万(70000-79999)....
     * 
     * @param n
     * @return
     */

    public int countNum(int n){

    if(n==1)

    return 1;
    else{

    return 9*countNum(n-1)+miShu(10,n-1);

    }

    }




    public int finalNum(int number){

    String s=number+"";

    int length=s.length();

    int total=0;

    for(int i=0;i<length;i++){

    int num2=Integer.parseInt(s.substring(i,i+1));

    if(i==length-1){//这是处理个位数字的,如果>=7 总数加1 整个循环结束。

    if(num2>=7){

    total++;

    }
    break;
    }
    if(num2==0)
    continue;

    if(num2>7){

    total+=(num2-1)*countNum(length-i-1)+miShu(10,length-i-1);

    }else if(num2==7){

    total+=(num2-1)*countNum(length-i-1)+Integer.parseInt(s.substring(i+1));//当某位为7的时候,就可以直接截取到此位。该位后面不管跟什么数字全都含有7.

    break;


    }else{

    total+=num2*countNum(length-i-1);
    }

    }

    return total;
    }

    public int miShu(int x,int y){//用来求10的N次房。

    int a=x;

    for(int i=0;i<y-1;i++){

    a=a*x;

    }

    return a;
    }最终结果为 1229473242,可以调用STRING测试一下。 估计要20分钟。