杭电 2089 ( 不要62 )

Posted William_xh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杭电 2089 ( 不要62 )相关的知识,希望对你有一定的参考价值。

这题吧,其实不是很难,就是在一个数里面找4和62,如果有,就是不幸运数字。

这是我最初的想法,但是会超时。

#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
#include<sstream>
#include<string.h>
using namespace std;

//超市代码
int find462(int n)
{
    int temp=n;
    int flag62=0;
    int flag4=0;
    int ck;
    while(temp>0)
    {
        ck=temp%10;
        if(ck==4)
        {
            return 1;//不吉利
        }

        else if(ck==2)
        {
            if(flag62==0)
            {
                flag62=1;
            }
        }
        else if(ck==6)
        {
            if(flag62==1)
            {
                return 1;
            }
        }
        else
        {
            flag62=0;
        }
        temp=temp/10;

    }

}


int main()
{

    int m,n;

    while(cin>>m>>n)
    {
        int cnt=0;
        if(m==0&&n==0)
        {
            break;
        }
        for(int i=m;i<=n;i++)
        {
            if(find462(i)==0)
            {
                cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

然后网上找了一种很投机取巧的办法,就是先在把范围中所有的不幸运数字全部找出来,然后再判断输入的范围中有没有这些数字,这样可能就是调用函数次数少了,然后就快了。

#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
#include<sstream>
#include<string.h>
using namespace std;

int a[1000001];


int main()
{
     int temp;
     memset(a,0,sizeof(int)*1000001);
    for(int i=1;i<1000001;i++)
    {
        temp=i;
        while(temp>0)
        {
            if(temp%10==4||temp%100==62)//这个 算法还是很 666的
            {
                a[i]=1;
                break;//下一个 i
            }
            temp=temp/10;
        }
    }

    int m,n;
    while(cin>>m>>n)
    {
        int cnt=0;
        if(m==0&&n==0)
        {
            break;
        }
        for(int i=m;i<=n;i++)
        {
            if(a[i]==0)
            {
                cnt++;
            }
        }
         cout<<cnt<<endl;
    }
    return 0;
}

 

以上是关于杭电 2089 ( 不要62 )的主要内容,如果未能解决你的问题,请参考以下文章

[hdu2089][不要62]

hdu 2089 不要62 数位DP入门

HDU 2089 不要62

HDU 2089 不要62 (递推+暴力)

HDU 2089 不要62

HDU 2089 不要62