前天TC的500分题,是一个组合数学的题。
主要思路是每一位一位算,0的时候特殊处理。
//返回n的位数
int bits(int n)
{
int ret = 0;
while(n)
{
ret++;
n/=10;
}
return max(1,ret);
}
//x^y
long long Pow(int x,int y)
{
return (long long)pow((double)x,(double)y);
}
int cnt(int n,int k)
{//计算1...n中出现k的次数
int ret = 0;
int num = bits(n);
if(k == 0) num--;
for(int i = 1; i<= num; ++i)
{
int b = n%(Pow(10,i))/(Pow(10,i-1));//取得b位值
if(b > k)
{
if(k == 0) //0单独处理
ret += (n/(Pow(10,i)))*(Pow(10,i-1));
else
ret += (n/(Pow(10,i))+1)*(Pow(10,i-1));
}
else if(b == k)
{
if(k ==0 ) ret += (n/(Pow(10,i))-1)*(Pow(10,i-1))+ n%(Pow(10,i-1)) +1 ;
else ret += n/(Pow(10,i))*(Pow(10,i-1))+ n%(Pow(10,i-1)) +1 ;
}
else
{
ret += n/(Pow(10,i))*(Pow(10,i-1));
}
}
return ret;
}