852753

说实话!这题真的很恶心,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;
}

posted on 2012-11-12 18:54  @ 小浩  阅读(307)  评论(0)    收藏  举报