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); } }
刚刚理解错了 重来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); } }
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); }}
修改一下: 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); } }
C2-1 C2-2
C3-1 C3-2 C3-3
都是概率问题, 这个可以一直做下去。
2008080808 =
2000000000
8000000
800
8
愚见如下累加器
for循环1到2008080808
转换为字符串,
查找字符串内是否有7
如果找到累加器++
则总共有n*10^n个数字 其中非零的数均占1/10
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
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); }
}
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);
}
}
* @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);
}}
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);
} }
0-999同理,注意不足三位的高位以0补齐,所以说如果是计算"0"的个数的话,稍微复杂一些了.
再就是,级数一样的数字比如100-199之间包含"7"的数字和200-299之间包含"7"的数字是一样多的,但700-799则会别它们多100个,也即"级数"个.有兴趣的朋友可以去编写java code试试看,效率可能是最高的了.
这可以分区间解决
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
同上
8
为1
把上述加总,我们不难的出答案.PS:这里我只证明了10^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----
继续我上面的思路:
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
+(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
代码一错误
代码二正确
#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
/**
* 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分钟。