说实话!这题真的很恶心,hdu竟然认为是这是热身题,服了!!哎!!
这也能叫热身题?好了,废话不多说,下面讲一下此题的方法:
这道题你只能用打表的方法否者肯定超时,哎!!
解决这道题我它有两种方法,但实际上也差不多,就是在统计的时候用了不同的方法!!
方法一:
#include<iostream>
#include<cstring>
using namespace std;
bool shu[1000010];
void jishu()
{
int i;
for(i=1;i<=1000010;i++)
{
for(int j=i;j>0;j/=10)
if(j%100==62||j%10==4)
{
shu[i]=false;break;
}
else shu[i]=true;
}
}
int main()
{
int a,b;
jishu();
while(scanf("%d%d",&a,&b)!=EOF)
{
int i,k=0;
if(a==0&&b==0) break;
for(i=a;i<=b;i++)
{
if(shu[i])
k++;
}
printf("%d\n",k);
}
return 0;
}
这种方法比较简单,也很好理解!!!哈!!!我就不多说了!!
下面讲解方法二:
方法二就是在处理的时候有点不同,用到了两个函数itoa()和strstr();
下面我分别讲解一下这两个函数的作用,
itoa()是类型转换函数
是有的时候格式是:
int a;
char b[20];
itoa(a,b,10)其中a为要转换的数,b为转换的字符,10为进制!!使用这个函数,可以将数字a转换成字符型的b,并存在数组里
strstr()函数原型是char *strstr( const char *s1, const char *s2 ),包含在头文件#include<string.h>中,功能是,
找出str2在str1中第一次出现的位置(不包扩str2的结束符),如果找到了,返回该位置的指针,否者返回NULL!!
#include<iostream>
#include<cstring>
using namespace std;
char ch[20];
bool shu[1000010];
void jishu()
{
int i;
for(i=1;i<=1000010;i++)
{
itoa(i,ch,10);
if((strstr(ch,"62")!=NULL)||(strstr(ch,"4")!=NULL))
shu[i]=false;
else shu[i]=true;
}
}
int main()
{
int a,b;
jishu();
while(scanf("%d%d",&a,&b)!=EOF)
{
int i,k=0;
if(a==0&&b==0) break;
for(i=a;i<=b;i++)
{
if(shu[i])
k++;
}
printf("%d\n",k);
}
return 0;
}