感觉可以找规律吧,比如说000到999的话0到9的概率一样都是1/10,那么1出现的次数就是3*1000*1/10=300,可以先算一下N的位数,如果N是3位数,那么就在300的基础上操作,除了M开头的那100个数,剩下的是等概率的,可以先减去这部分,然后看一下N的首位占了几份,算出这部分后再判断和M的大小,决定加不加那100个,代码: static int NContainsM(int N,int M){ int length = LengthOfDigits(N); int FirstNum = N/(int)(Math.pow(10,length-1)); int res = length*((int)Math.pow(10,length))/10; res-=Math.pow(10,length-1); if(FirstNum<M){ res=res*(FirstNum+1)/9; }else if(FirstNum==M){ res=res*(FirstNum+1)/9; res+=(N-M*Math.pow(10,length-1)); }else{ res=res*(FirstNum)/9; res+=Math.pow(10,length-1); } return res; } static int LengthOfDigits(int N){ int res = 0; while(N>0){ N/=10; res++; } return res; }