• 纪中5日T3 1566. 幸运锁(lucky.pas/c/cpp)


    1566. 幸运锁(lucky.pas/c/cpp)

    题目描述

    有一把幸运锁,打开它将会给你带来好运,但开锁时需要输入一个正整数(没有前导0)。幸运锁有一种运算,对于一个正整数,返回他的相邻两位数字间的差,如1135,运算结果为22(会去掉前导0)。
    现在已知只有经过反复运算最终结果为7的数才能打开这把锁,给你一个区间[a,b],问该区间中有多少个能打开幸运锁的幸运数。

    输入

       第一行两个整数a,b。

    输出

       一个整数K,表示共有多少个这样的数。

    样例输入

    1 10

    样例输出

    1

    数据范围限制

    【限制】

    1<=a<=b<=10^9。

    30%的数据有b<=10^6。

    Solution(28分)

    貌似正好遇上服务器出问题了呢

    这就不是我的问题了

    (这也不是服务器的问题嘛!你怎么可以这样想呢?)

     我觉得我的代码是正确的

    而测试点2呢,我用一个打表的程序也过了

    table

    首先奉上我的table.cpp

    //幸运锁表
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a,b,lucky,h,f[20],ans;
    int logn(int num)
    {
        if(num==1) return 1;
        return log(num)/1;
    }
    void fj(int num)
    {
        int len=logn(num);
        for(int i=0;i<len;i++)
        {
            f[i]=((int)(num/pow(10,i)))%10;
        }
        return;
    }
    void run(int num[],int len)
    {
    //    检测是否为0000000..7||0000000..* 
        bool flag7=1;
        for(int i=1;i<len;i++)
        if(num[i]!=0) {
            flag7=0;
            break;
        }
        
        if(flag7) 
        {
            if(num[0]==7) 
            {
                cout<<h<<",";
                ans++;
            }
            
            return;
        }
        
        
    //    算差
        int w[len];
        memset(w,0,sizeof(w));
        for(int i=0;i<len-1;i++)
            w[i]=abs(num[i]-num[i+1]);
    //    删除前导零
        int flag0=1;
        for(int i=len-1;i>=0;i--)
        {
            if(flag0)
            {
                if(num[i]==0)
                    len--;
                else
                    flag0=0;
            } 
            else 
                break;
        }
        run(w,len-1);
    }
    int main()
    {
    //    freopen("lucky.in","r",stdin);
    //    freopen("lucky表.txt","w",stdout);
        for(h=1;h<=1000000;h++)
        {
            //分解数字
            fj(h);
            run(f,logn(h));
        }
        cout<<"
    ans="<<ans; 
        return 0;
    }

    想要过程解释,还请看注释。

    正解会再做详细解释。

    这个cpp可以打出从a~b所有满足条件的数

    但我并没有找到什么规律鸭

    Code(46分)

    //幸运锁
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a,b,lucky,f[20],ans;
    int logn(int num)
    {
        if(num==1) return 1;//本来log(1)会等于0的 
        return log(num)/1;
    }
    void fj(int num)
    {
        int len=logn(num);
        for(int i=0;i<len;i++)
        {
            f[i]=((int)(num/pow(10,i)))%10;
        }
        return;
    }
    void run(int num[],int len)
    {
    //    检测是否为0000000..7||0000000..* 
        bool flag7=1;
        for(int i=1;i<len;i++)
        if(num[i]!=0) {
            flag7=0;
            break;
        }
        //如果flag7==1,就说明该数只有个位了,其他位全是零 
        if(flag7) 
        {
            if(num[0]==7) 
                ans++;
            return;//一个位数是一定不能变成7的 
        }
    //    算差
        int w[len];
        memset(w,0,sizeof(w));//开始时忘了初始化,坑了我好久 
        for(int i=0;i<len-1;i++)
            w[i]=abs(num[i]-num[i+1]);//相邻两数之差要取绝对值 
    //    删除前导零
        int flag0=1;
        for(int i=len-1;i>=0;i--)
        {
            if(flag0)
            {
                if(num[i]==0)
                    len--;
                else
                    flag0=0;
            } 
            else 
                break;
            
        }
        run(w,len-1);//就是这里! 求差后,len一定会自然的少一个 
    }
    int main()
    {
    //    freopen("lucky.in","r",stdin);
    //    freopen("lucky.out","w",stdout);
        cin>>a>>b;
        for(int i=a;i<=b;i++)
        {
            //分解数字
            fj(i);
            run(f,logn(i));
        }
        cout<<ans;
        
        return 0;
    }

     修改了这个地方后,成功的又对了一个测试点。

    下载一个数据看看?

    File Not Found!

    老师呢,看了看那些100分的同学的代码。

    大小都是几MB几MB的。

    又因为我是时间超限……

     你明白了吗?

     打表!

     那个。。。源代码太长,我我我上传不了。

    就先发个压缩包吧

     https://files-cdn.cnblogs.com/files/send-off-a-friend/lucky.rar

     数论

    等待着数论的方法出现。。。

    老师加油!

     

  • 相关阅读:
    GISer面对创业的困惑
    近期微博吐槽言论存档,涉及“性能优化”、C++陋习等
    HDU 2825 Wireless Password【AC自动机+DP】
    20130809, 微软八月安全补丁提前通知
    终于把3DMAX的MSE搞定了!
    UVA 11464 Even Parity (独特思路)
    [置顶] hdu 4418 高斯消元解方程求期望
    UVA 10652 Board Wrapping
    少儿编程-教育:少儿编程教育
    少儿编程:目录
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/11303828.html
Copyright © 2020-2023  润新知