幸运数-YACS

文章讲述了两种解题策略来找到第n个幸运数。第一种方法利用位运算,将6和8视为二进制的0和1,通过计算确定数字的位数和每一位的值。第二种方法是通过递归,结合奇偶性构建幸运数字符串。这两种方法都适用于大数范围的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

十进制数字中,只含有 6 与  的数字被称作幸运数。将所有的幸运数从小到大排序,第一个幸运数是 6,接下来是

8,66,68,86,88,  …8,66,68,86,88,  …

给定 n,请输出第 n 个幸运数。

输入格式

单个整数:表示 n。

输出格式

单个整数:表示第 n 个幸运数。

数据范围

  • 30% 的数据,1≤n≤500
  • 60%的数据,1≤n≤1,000,000
  • 100%数据,1≤n≤1,000,000,000,000,000

样例数据

输入:7

输出:666

解题思路一

 找规律发现,一位有6和8两个数,二位有四个数,三位有8个数,几位数就是2的几次,其实就是n位拆分成前面一位和后面n-1位,每位有两种可能。

6看成0,8看成1,所有幸运数都利用左移或右移位运算转为二进制数0和1,只需要找出要查找的第n个数在第几层的第几个就能解决该题,注意每层从0开始计数。

先来看如何找到要查找的数在第几层,也就是找出其是几位数:

因为数据规模超出int范围,为防止溢出,数据类型要定义为long long

输入要查找的第n个数,循环每次左移1位判断,m用于记录在第几层,也就是几位数,而n每次减去左移的位数,可以理解为每次剪枝掉前面不需要的幸运数,只保留在当前m层的第几位上,注意是从0计数,最后还需n-1,最终我们得到了要查找的数在第m层的第n个位置。

 最后逐个判断每位数,1则输出8,0则输出6:

至于为什么m-1,举例要找的数在第3层的第5位,可理解为下标4的二进制是100,从左往右依次取出每个数&1,右边最后一位从0开始,左边最高位就得m-1,拿出每个数&1,是1输出8,0输出6。

解题思路二

第二种解法是把所有幸运数当作字符串,递归处理。  

f(1) = "6"
f(2) = "8"
f(3) = "66"        相当于 f(1) + "6"        奇数 + "6"        f( (3-1)/2 ) + "6"
f(4) = "68"        相当于 f(1) + "8"        偶数 + "8"        f( (4-1)/2 ) + "8"
f(5) = "86"        相当于 f(2) + "6"        奇数 + "6"        f( (5-1)/2 ) + "6"
f(6) = "88"        相当于 f(2) + "8"        偶数 + "8"        f( (6-1)/2 ) + "8"
f(7) = "666"      相当于 f(3) + "6"        奇数 + "6"        f( (7-1)/2 ) + "6"

 递归公式 f( (n-1)/2 ) + (n%2!=0?"6":"8")

递归边界无需考虑0,n==1 "6",n==2 "8"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值