没事刷刷LetCode——整除幸运数
整除幸运数
题目描述
假定幸运数是只包含4或7的正整数,如7、47。判断一个正整数是否能被一个幸运数整除。是则输出YES,否则输出N0。不考虑负数,0或者其他特殊情况。不考虑流出或者超出整型范围的情况。
示例 1 :
输入:47
输出:YES
解释:47能被幸运数47整除 。
暴力解法 :
从1到输入n,遍历出n的所有因数,一个个判断是否是幸运数,是就输出YES,否则输出NO。(暴力解法过于简单,此处不给出实现方法。)
幸运数遍历法 :
我们需要找到一种方法,能够列举出所有的幸运数,通过输入与这些幸运数之间的余数判断该输入是否能被幸运数整除,如果直到有一个幸运数已经大于输入了,还没有找到可以整除的幸运数,则输出NO。
得到幸运数
现在,我们先假设存在这样一个问题:假定幸运数是只包含4或7的正整数,如7、47。我们需要通过给定的数值K,得到第K大的幸运数,如给定1,就是4,给定8,就是447。现在我们需要求解这个问题。
我们假设存在一颗树,如下所示。
那么,当给定一个K值时,我们要求这个数是多少,就映射成了以下几步
1:这个数在这颗树的第几层,也就是h=int(log2(K+1)+1)
2: 第h层以上总共有多少个数,也就是num=pow(2, h-1) - 1,注意,这里包含无意义的主结点。
3:这个数在第h层的第几个,从0开始数,比如444就是第4层的第0个数,也就是idx=K-num
此时,假设我们要得到第8个数(447),也就是h=int(log2(8+1)+1)=4;
num=pow(2,4-1)-1=7;idx=8-7=1;
也就是第4层第1个点。
第四层,我们知道这个数肯定是个三位数,1可以化成二进制001,
0对应4,1对应7,那么001就是447。就求解得到了。
程序如下:
# 翻转整数值 例:123->321
int reverseNum(int num) {int result = 0, temp;while (true) {if (num != 0) {temp = num % 10;result = result * 10 + temp;num = num / 10;}else {break;}}return result;
}# 从小到大获取第K大的幸运数
int getLuckyNum(int K) {int h, num;# 求得层数h = log2(K + 1) + 1;# 求得前几层的总共节点数num = pow(2, h - 1) - 1;# 求得是第h层的第几个,从0开始int idx = K - num;int ans = 0;for (int i = 0; i < h - 1; i++) {# 与最低位取并集,为1就是7,为0就是4if ((idx & 1) == 0) {ans = ans * 10 + 4;}else {ans = ans * 10 + 7;}idx = idx >> 1;}# 翻转数值,获得最终的幸运数ans = reverseNum(ans);return ans;
}
幸运数遍历法
int reverseNum(int num) {int result = 0, temp;while (true) {if (num != 0) {temp = num % 10;result = result * 10 + temp;num = num / 10;}else {break;}}return result;
}int getLuckyNum(int K) {int h, num;h = log2(K + 1) + 1;num = pow(2, h - 1) - 1;int idx = K - num;int ans = 0;for (int i = 0; i < h - 1; i++) {if ((idx & 1) == 0) {ans = ans * 10 + 4;}else {ans = ans * 10 + 7;}idx = idx >> 1;}ans = reverseNum(ans);return ans;
}int main( )
{int n, ans;# 输入数值scanf("%d", &n);for (int i = 1; i<=n; i++){# 遍历幸运数ans = getLuckyNum(i);# 如果幸运数比输入还大,则该数不能被任意幸运数整除。if (ans > n){printf("NO");break;}else{# 如果输入能被幸运数整除,则输出YES。if (n % ans == 0){printf("YES");break;}}}return 0;
}
没事刷刷LetCode——整除幸运数相关推荐
- 试题 历届试题 幸运数(二分)
试题 历届试题 幸运数 资源限制 时间限制:1.0s 内存限制:256.0MB 题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然 ...
- [蓝桥杯][2013年第四届真题]幸运数-模拟+dfs
题目描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. 我们从2这个数开始.把所 ...
- python计算区间内偶数和_Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和...
晚饭后朋友发来个问题,正好无事做,动手写了一下 若一个正整数有偶数个不同的真因子,则称该数为幸运数.如4含有2个真因子为 1 和 2 .故4是幸运数.求[2,100]之间的全部幸运数之和. 常规思路 ...
- 【每日蓝桥】16、一三年省赛Java组真题“幸运数”
你好呀,我是灰小猿,一个超会写bug的程序猿! 欢迎大家关注我的专栏"每日蓝桥",该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想.数据结构等内容, ...
- 幸运数划分 lucky
题目描述 判断一个正整数n是否能被一个"幸运数"整除.幸运数是指一个只包含4或7的正整数.如:7.47.477等都是幸运数,17.42则不是幸运数. 输入 一行一个正整数n ...
- Java习题练习:幸运数
目录 题目 整体思路 源代码 题目 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. ...
- java蓝桥杯练习 幸运数
java蓝桥杯练习 幸运数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出 ...
- 题目 1441: 幸运数
题目 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. 我们从2这个数开始.把所有序号 ...
- 幸运数 c++程序(详解,附完整代码)
标题[蓝桥杯][2013年第四届真题]幸运数 时间限制: 1Sec 内存限制: 128MB 提交: 696 解决: 326 题目描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的" ...
最新文章
- Batch Normalization 与Dropout 的冲突
- 二叉树的最小深度Python解法
- DRF数据验证+数据存储
- 您应该在2020年首先学习哪种编程语言? ɐʌɐɾdıɹɔsɐʌɐɾ:ɹǝʍsuɐ
- 今年颜宁在《自然》发表三篇论文仍归清华,网友:可惜以后不是了
- Java面向对象编程篇5——枚举
- .net中所用到的编码名称和对应的代码页(Encoding.GetEncoding) .
- MySQL的NULL值
- P3399 丝绸之路(线性二维dp)
- AI在中国,还没到抢切蛋糕的时候
- jmeter 录制回放工具badboy 下载安装步骤
- 要怎么在计算机里清除桌面内存,告诉你电脑内存怎么清理
- live2d 看板娘
- DSP28335的eCAP模块
- 微信开发平台第三方平台86004无效微信号
- 一个C++程序员的学习经历
- SpringCloud(9)— Elasticsearch聚合和自动补全
- 气动调节阀运转、查看及维护保养
- Linux命令:wget
- SEOer需要了解的十大百度搜索技巧