整除幸运数

题目描述

假定幸运数是只包含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. 试题 历届试题 幸运数(二分)

    试题 历届试题 幸运数 资源限制 时间限制:1.0s 内存限制:256.0MB 题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然 ...

  2. [蓝桥杯][2013年第四届真题]幸运数-模拟+dfs

    题目描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. 我们从2这个数开始.把所 ...

  3. python计算区间内偶数和_Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和...

    晚饭后朋友发来个问题,正好无事做,动手写了一下 若一个正整数有偶数个不同的真因子,则称该数为幸运数.如4含有2个真因子为 1 和 2 .故4是幸运数.求[2,100]之间的全部幸运数之和. 常规思路 ...

  4. 【每日蓝桥】16、一三年省赛Java组真题“幸运数”

    你好呀,我是灰小猿,一个超会写bug的程序猿! 欢迎大家关注我的专栏"每日蓝桥",该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想.数据结构等内容, ...

  5. 幸运数划分 lucky

    题目描述 ​ 判断一个正整数n是否能被一个"幸运数"整除.幸运数是指一个只包含4或7的正整数.如:7.47.477等都是幸运数,17.42则不是幸运数. 输入 ​ 一行一个正整数n ...

  6. Java习题练习:幸运数

    目录 题目 整体思路 源代码 题目 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. ...

  7. java蓝桥杯练习 幸运数

    java蓝桥杯练习 幸运数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出 ...

  8. 题目 1441: 幸运数

    题目 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出自然数1,2,3,4,5,6,- 1 就是第一个幸运数. 我们从2这个数开始.把所有序号 ...

  9. 幸运数 c++程序(详解,附完整代码)

    标题[蓝桥杯][2013年第四届真题]幸运数 时间限制: 1Sec 内存限制: 128MB 提交: 696 解决: 326 题目描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的" ...

最新文章

  1. Batch Normalization 与Dropout 的冲突
  2. 二叉树的最小深度Python解法
  3. DRF数据验证+数据存储
  4. 您应该在2020年首先学习哪种编程语言? ɐʌɐɾdıɹɔsɐʌɐɾ:ɹǝʍsuɐ
  5. 今年颜宁在《自然》发表三篇论文仍归清华,网友:可惜以后不是了
  6. Java面向对象编程篇5——枚举
  7. .net中所用到的编码名称和对应的代码页(Encoding.GetEncoding) .
  8. MySQL的NULL值
  9. P3399 丝绸之路(线性二维dp)
  10. AI在中国,还没到抢切蛋糕的时候
  11. jmeter 录制回放工具badboy 下载安装步骤
  12. 要怎么在计算机里清除桌面内存,告诉你电脑内存怎么清理
  13. live2d 看板娘
  14. DSP28335的eCAP模块
  15. 微信开发平台第三方平台86004无效微信号
  16. 一个C++程序员的学习经历
  17. SpringCloud(9)— Elasticsearch聚合和自动补全
  18. 气动调节阀运转、查看及维护保养
  19. Linux命令:wget
  20. SEOer需要了解的十大百度搜索技巧

热门文章

  1. java多线程和线程池
  2. android显示图片的两种方法
  3. Praat脚本-013 | 无需标注自动切除音频首尾静音段
  4. [团队管理]—从10则经典故事学管理
  5. Time machine 备份 硬盘分区格式化
  6. 软件测试之测试用例设计(二)
  7. idea自动补全功能
  8. man 中文 linux,man page (简体中文)
  9. php - 前端表单上传文件并保存到指定服务器目录
  10. 聪明的人都有这些思维格局