题目1:10到10000中0的个数。
题目2:10到10000中所有位乘积为0的数的个数。
题目1的解决依赖于题目2,所以首先要求出10到10000中所有含有0的数字的个数。
1、当为2位数时:
第一位不能为0,从1到9中取,第二位要为0,则含有0的数字的个数为9*1=9。
2、当为3位数时:
第一位不能为0,从1到9中取,
含有1个0,9*C(2,1)*9=162
含有2个0,9*1=9
3、当为4位数时,第一位不能为0,从1到9里面取得,
当数字中有一个0时,0可能在第一位,第二位,或者第三位,从3位中取1个,其余位不能为0,只能从1到9里面取,
含有0的数字个数为 9*C(3,1)*9*9=2187
当数字中有2个0时,就是从后面的3位中取出2位来放置这2个0,其余1位只能从1到9里面取得,
所以含有0的数字个数为9*C(3,2)*9=243。
当数字中有3个0时,
含有0的数字个数为9*1=9。
4、当数字为10000时,也满足条件,所以含有0的数字个数再加1
将以上所有红色的结果相加,所以10到10000中所有位乘积为0的数的个数为2620。
题目一可以在以上每种情况求出含有0的数字的个数基础上,乘以每个数字中0的个数,再相加就能得出结果。
10到10000中0的个数为2893。
程序验证:
#include<iostream>
using namespace std;
int main()
{
int total=0;
int num=0;
int num0=0;
int temp=0;
for(int j=10;j<=10000;j++)
{
total=1;
int i=j;
while(i!=0)
{
temp=i%10;
if(temp==0)
num0++;
total*=temp;
i=i/10;
}
if(total==0)
{
//cout<<j<<" ";
num++;
}
}
cout<<"10到10000中0的个数"<<endl;
cout<<num0<<endl;
cout<<"10到10000中所有位乘积为0的数的个数"<<endl;
cout<<num<<endl;
return 0;
}
结果: