应该属于数位dp的一题,暴力方法可过就先偷懒了……
第二段代码是别人的,转化成字符串进行处理
#include <cstdio>
__int64 data[1000005];
bool OK (int n)
{
int i,j;
for (j=1;j<=n;j*=10)
{
if (n%(j*10)-n%j==4*j) //某位为4
return false;
if (j>=10 && n%(j*10)-n%(j/10)==62*(j/10)) //某位和低位62
return false;
}
return true;
}
void Init ()
{
int i=0;
__int64 cnt=0;
for (i=0;i<=1000000;i++)
if (OK(i))
data[i]=++cnt;
else
data[i]=cnt;
}
int main ()
{
int n,m;
Init ();
while (~scanf("%d%d",&n,&m),n||m)
printf("%I64d\n",data[m]-data[n-1]);
return 0;
}
#include <cstdio>
#include <cstring>
int dp[1000010];
void init ()
{
int i;
char str[10];
for (i=1;i<1000000;i++)
{
sprintf(str,"%d",i);
if (strstr(str,"62")==NULL && strstr(str,"4")==NULL)
dp[i]=1;
dp[i]+=dp[i-1];
}
}
int main ()
{
init ();
int n,m,ans;
while (scanf("%d%d",&n,&m),n||m)
printf("%d\n",dp[m]-dp[n-1]);
return 0;
}