纪中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

数论

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

老师加油!

原文地址:https://www.cnblogs.com/send-off-a-friend/p/11303828.html

时间: 2024-10-09 05:44:38

纪中5日T3 1566. 幸运锁(lucky.pas/c/cpp)的相关文章

纪中10日T3 2296. 神殿 bfs

原文地址:https://www.cnblogs.com/send-off-a-friend/p/11330414.html

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

纪中10日 2313. 动态仙人掌 (File IO): input:dinosaur.in output:dinosaur.out 时间限制: 1500 ms  空间限制: 524288 KB  具体限制 Goto ProblemSet 题目描述 沙雕游戏……反正我没玩过…… 输入 输出 样例输入 数据范围限制 Solution 考试时想的是对的 为什么就是没有分呢? 首先看看仙人掌有几种情况 situation1 两个比较分开的仙人掌…… 小恐龙按照这样走(跳),并没有什么特殊操作.这时的最

纪中17日T1 2321. 方程

纪中17日T1 2321. 方程 (File IO): input:cti.in output:cti.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 Goto ProblemSet 题目描述 输入 输出 样例输入 样例输出 数据范围限制 提示 吐槽 这些图片太模糊了吧…… 还有那吓人的 mod 998244353 都使得我们对这道题的恐惧感叠加了998244353层…… 没想到……只有三种答案!(三进制呵呵哒) Solution (约定:用line[i]表示第

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

2161. 围攻 (File IO): input:siege.in output:siege.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 Goto ProblemSet 题目描述 经过刘邦的严密缉查,项羽的位置也就水落石出了.刘邦便趁机集合军队,进行对项羽的围攻.为了增加胜率,张良研究出一种全新的战法,目的就是一举打败难缠的项羽.  这种军队共有N个单位,一个接着一个排成一排,每个单位可以是士兵,或者是战车,这样的组合可以爆发出意想不到的强大战斗力:但有一

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

2122. 幸运票 (File IO): input:tickets.in output:tickets.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 Goto ProblemSet 题目描述 给你一个数N(1<=N<=50),每张票有2N位,同时给你这2N位上的和S,如果这张票的前N位的和等于后N位的和,那我们称这张票是吉祥的,每一位可以取0-9. 你的任务是计算吉祥票的总数. 输入 输入N和S,S是所以位上的和,假设S<=1000 输出 输出吉祥票

纪中10日T1 2300. 【noip普及组第一题】模板题

2300. [noip普及组第一题]模板题 (File IO): input:template.in output:template.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 题目描述 输入 输出 样例输入 样例输出 数据范围限制 朴素算法 考试开始的前一个小时我一直在折腾朴素算法 -> 对拍 1 #pragma GCC optimize(2) 2 #include<bits/stdc++.h> 3 #define IL inline 4 usin

纪中……结束了……

纪中25日 纪中二十多天的生活,就这样结束了. 带着没有离开c组的遗憾,结束了. 算是日久生情吧,中山纪念学校,于我而言,已经成为了一段无法忘记的记忆. 但是……仅仅只能一遍又一遍的回忆了. 科学馆三层楼的机房,是我们一起学习的地方,有说笑,有模拟赛:有爆零,有AK. 最重要的还是,大家都在一起,有陪伴吧. 同来望月人何处,风影依稀似去年. 原文地址:https://www.cnblogs.com/send-off-a-friend/p/11407424.html

在Winform开发中使用日程控件XtraScheduler(2)--深入理解数据的存储

在上篇随笔<在Winform开发中使用日程控件XtraScheduler>中介绍了DevExpress的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如OutLook里面就有日历的模块,但是这个日程控件真的是很复杂的一个控件,需要全面掌握可能需要花费很多的时间去了解,由于是技术研究,我总是希望把它常用的功能剖析的更加彻底一些,前面随笔也介绍了它的存储功能,把它基于实体类的方式存储在数据库里面,不过介绍的还不够,本文继续上面的内容,进行数据存储方面的介绍. 在

中美印日四国程序员比较

源自:http://www.myexception.cn/other/1391135.html 最近以裁判的身份参加了公司举办的编程大赛,发现高手云集,对公司内部的程序员能力也有了更深入的了解.我觉得编程能力对程序员而言,虽然很重要,但并不是全部.那么作为一个程序员,到底应该具备什么样的能力呢?这个话题显然太大.不过我觉得可以看看其它国家的程序员,也许可以得到一些借鉴.我有幸和中国,美国,印度和日本四国程序员有比较深入的合作过.虽然他们不一定有代表性,但我觉得他们的共性还是比较明显的.以下的比较