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

Posted send-off-a-friend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纪中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<<"\\nans="<<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

 数论

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

老师加油!

 

以上是关于纪中5日T3 1566. 幸运锁(lucky.pas/c/cpp)的主要内容,如果未能解决你的问题,请参考以下文章

纪中23日c组T3 2161. 2017.7.11普及围攻

纪中20日c组T2 2122. 2016-12-31普及组模拟幸运票

纪中5日T1 1564. 旅游

纪中17日T1 2321. 方程

纪中10日T1 2313. 动态仙人掌

2021.7.15 纪中 Day 4 总结