33,007
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
typedef long int int32;
int32 containFig(int32 n, int fig)
{
int c;
int32 s, powm = 1, m = 1, m0 = 0;
for(s = n; s; s /= 10, powm *= 9)
{
if((c=s%10) == fig)
m = fig*powm;
else
{
if(c > fig) c--;
m += c*powm;
}
m0 += powm;
}
if(!fig)
m += m0;
return (n+1-m);
}
void main(int argc, char *argv[])
{
int32 N = 100000000L;
int fig = 0;
while( scanf("%d %d", &N, &fig) == 2)
printf( "%d contain %d char number = %d, %d\n", N, fig, containFig(N, fig), containFig2(N, fig));
}
// 如果是求某个正整数N以内的整型数中含数字a的数的个数,那就用归纳法:
// 同样先求正整数N以内无数字1的数的个数M
// N = Cn-1*10^(n-1) + ... + Ci+1*10^(i+1) + Ci*10^i + ... + C0
// Ni = Cn-1*10^(n-1) + ... + Ci+1*10^(i+1)
// m(i) Ni至N之间无数字a的数的个数
// Ci 取0~Ci个数字
// 1、Ci = a m(i) = a*9^(i-1)
// 1、Ci < a m(i) = m(i-1) + Ci*9^(i-1)
// 3、Ci > a m(i) = m(i-1) + (Ci-1)*9^(i-1)
// 由m(0)则可计算出m(n-1) 故 N以内的整型数中含数字1的数的个数 = N + 1 - m(n-1)
// m(0) = (C0 < a) ? C0 : C0-1 也可
// m(0) = fig*9^0 C0=a
// (C0-1)*9^0+1 C0> 1
// (C0-1)*9^0+1 C0> 1
#include <stdio.h>
#include <stdlib.h>
typedef long int int32;
int32 containFig(int32 n, int fig)
{
int c;
int32 s, k = 0, powm = 1, m = 1;
for(s = n; s; s /= 10, powm *= 9, k++)
if((c=s%10) != 0)
{
if(c == fig)
m = fig*powm;
else
{
if(c > fig) c--;
m += c*powm;
}
}
if(!fig)
for(powm = 1 ; --k; powm *= 10)
m += powm;
return (n+1-m);
}
void main(int argc, char *argv[])
{
int32 N = 100000000L;
int fig = 1;
while( scanf("%d %d", &N, &fig) == 2)
printf( "%d contain %d char number = %d, %d\n", N, fig, containFig(N, fig), containFig2(N, fig));
}