上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
12下一页
返回列表 发新帖

PTA 7-45 找完数

[复制链接]
  • TA的每日心情
    无聊
    2022-6-12 10:58
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    6

    主题

    38

    回帖

    51

    积分

    初级工程师

    积分
    51

    新人报道

    发表于 2024-3-21 00:50:48 | 显示全部楼层 | 阅读模式
    我写了一个与样例一样的输出结果,但是无法通过检测。希望有朋友可以为我解惑。 屏幕截图(3).png
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-3-21 07:26:12 | 显示全部楼层

    首先是让你去写算法
    你这种叫打表,理论也可以,但是实际违反了练习的本质
    而且你需要手动打表出来1-10000的所有内容,所以还是推荐用代码写出来

    其次,这个Easy题,稍微思考一下就能秒的垃圾题

    FBI WARNING

    装逼版秒法,数据范围内低时间复杂度,纯对答案编程,请勿正式场合玩

    6= 1 + 2 + 3
    28= 1 + 2 + 4 + 7 + 14

    很容易想到进制方面,查表可知
    055704eo8shvii70787va5.png

    然后查一下奇完数
    055820hnsrnf8oxnx4qykz.png
    所以可以直接通过进制判断
    设检测8128,我们应判断最低有效位以下是否为全0
    最低有效位以上是否为全1
    获取最低有效位是x-x&(x-1),可以获得最低位为64
    获取后续为全1可以通过二进制的下滑特性,将64-1,得到代码

      const baseBinary = x - (x & (x - 1)) - 1;
      if (num & (baseBinary - 1 !== 0)) {
        return 0;
      }

    然后可以将原数字与baseBinary - 1做或运算,如果符合完数则是满1

    接下来可以根据最位末端求log得到位移多少,因为1比0多一位,所以我们可以多位移一次,然后相加低位满1+1来相加判断是否得到原数,完整检查代码

    function checkNumber(num) {
      const baseBinary = num - (num & (num - 1)) - 1;
      if (num & (baseBinary - 1 !== 0)) {
        return false;
      }
      const moveNum = Math.log2(baseBinary + 1);
      if ((baseBinary << (moveNum + 1)) + (baseBinary + 1) === num) {
        return true;
      }
      return false;
    }

    如果符合条件就不断除2,可以得出代码

    function getRangeNumber(left, right) {
      let text = "";
      for (let index = left; index <= right; index++) {
        if (checkNumber(index) === true) {
          let resultList = [];
          let result = Math.ceil(index / 2);
          while (result !== 1) {
            resultList.push(result);
            result = Math.ceil(result / 2);
          }
          text+=`${index} = 1 + ${resultList.reverse().join(' + ')}\n`
        }
      }
      return text;
    }

    结果多了一个120和2016

    6 = 1 + 2 + 3
    28 = 1 + 2 + 4 + 7 + 14
    120 = 1 + 2 + 4 + 8 + 15 + 30 + 60
    496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
    2016 = 1 + 2 + 4 + 8 + 16 + 32 + 63 + 126 + 252 + 504 + 1008
    8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064

    我们可以在利用检查特性秒
    072135yxez3q6f33xay8z7.png
    得到代码

          let charArray = index.toString().split("");
          while (charArray.length !== 1) {
            charArray = charArray
              .reduce((accumulator, currentValue) => {
                return accumulator + parseInt(currentValue);
              }, 0)
              .toString()
              .split("");
          }

    跑一下再看看

    6 = 1 + 2 + 3
    28 = 1 + 2 + 4 + 7 + 14
    496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
    8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064

    完整JS代码

    function checkNumber(num) {
      const baseBinary = num - (num & (num - 1)) - 1;
      if (num & (baseBinary - 1 !== 0)) {
        return false;
      }
      const moveNum = Math.log2(baseBinary + 1);
      if ((baseBinary << (moveNum + 1)) + (baseBinary + 1) === num) {
        return true;
      }
      return false;
    }
    function getRangeNumber(left, right) {
      let text = "";
      for (let index = left; index <= right; index++) {
        if (checkNumber(index) === true) {
          let resultList = [];
          let result = Math.ceil(index / 2);
          let charArray = index.toString().split("");
          while (charArray.length !== 1) {
            charArray = charArray
              .reduce((accumulator, currentValue) => {
                return accumulator + parseInt(currentValue);
              }, 0)
              .toString()
              .split("");
          }
          while (result !== 1) {
            resultList.push(result);
            result = Math.ceil(result / 2);
          }
          if (index === 6 || charArray[0] === '1') {
            text += `${index} = 1 + ${resultList.reverse().join(" + ")}\n`;
          }
        }
      }
      return text;
    }
    console.log(getRangeNumber(1, 10000));
    
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-3-21 07:33:04 | 显示全部楼层

    图片.png

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    14 小时前
  • 签到天数: 811 天

    [LV.10]以坛为家III

    31

    主题

    552

    回帖

    1555

    积分

    荣誉开发者

    积分
    1555

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2024-3-21 08:13:51 | 显示全部楼层
    李恒道 发表于 2024-3-21 07:26
    [md]首先是让你去写算法
    你这种叫打表,理论也可以,但是实际违反了练习的本质
    而且你需要手动打表出来1-10 ...

    TQL GGNB
    虽然每个字都认识,但是连起来就不认识了
    反正GGNB就完事了
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2022-6-12 10:58
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    6

    主题

    38

    回帖

    51

    积分

    初级工程师

    积分
    51

    新人报道

    发表于 2024-3-21 08:15:28 | 显示全部楼层
    李恒道 发表于 2024-3-21 07:26
    [md]首先是让你去写算法
    你这种叫打表,理论也可以,但是实际违反了练习的本质
    而且你需要手动打表出来1-10 ...

    好哥哥,手机在论坛交流不甚方便,晚上下班用上电脑再与你交流
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-3-21 08:24:42 | 显示全部楼层
    steven026 发表于 2024-3-21 08:13
    TQL GGNB
    虽然每个字都认识,但是连起来就不认识了
    反正GGNB就完事了

    普解我记着是N方,这个过滤器O1级别,除法logN,时间复杂度N*logN毒打N方
    (其实是我觉得普解没意思,特地玩这种进制的骚解法的

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-3-21 08:25:00 | 显示全部楼层
    ChHN 发表于 2024-3-21 08:15
    好哥哥,手机在论坛交流不甚方便,晚上下班用上电脑再与你交流

    哥哥竟然不是学生啊
    还做算法
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2024-3-21 09:54:19 | 显示全部楼层
    李恒道 发表于 2024-3-21 08:24
    普解我记着是N方,这个过滤器O1级别,除法logN,时间复杂度N*logN毒打N方
    (其实是我觉得普解没意思,特地 ...

    范围也就1-1w,直接打表秒了
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-3-21 21:45:19 | 显示全部楼层
    王一之 发表于 2024-3-21 09:54
    范围也就1-1w,直接打表秒了

    打表我就没法装逼了!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2022-6-12 10:58
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    6

    主题

    38

    回帖

    51

    积分

    初级工程师

    积分
    51

    新人报道

    发表于 2024-3-21 21:49:01 | 显示全部楼层

    让我感到苦恼的点在于,我将"样例"直接通过打表方式输出,但是检测程序甚至"样例"测试代码都不给我通过。简陋的打表代码如下:

    
    #include<stdio.h>
    
    int main(void){
        int m,n;
        scanf("%d %d",&m,&n);    printf("6 = 1 + 2 + 3\n28 = 1 + 2 + 4 + 7 + 14");
        return 0;
    }
    

    屏幕截图(5)_LI.jpg屏幕截图(7)_LI.jpg

    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表