在线编程——丑数系列(python&C++)

丑数定义:“丑数”(ugly number)是正数,且质数因子只包含2、3、5。例如6,8是丑数,但14不是丑数,因为它包含因子7,规定整数1为第一个丑数。

问题分析:丑数一定是有限个2、3、5的乘积因为所有的正整数都能分解成1与一个或多个素数的乘积。如果一个数是丑数,那么反复除以2、3、5后,一定会是1;如果一个数不是丑数,那么反复除以2、3、5后,一定还会剩下了一个质数无法被2、3、5整除。

编程内容(python代码 & C++代码):

1、判断一个整数是否是丑数?

2、给定区间,输出丑数的个数或丑数。

3、求第N个丑数

##############################################################################################

寻找丑数算法1:

(1)设置一个计数器用来统计出现的丑数的个数

(2)从1开始遍历每一个整数,判断是否是丑数,如果是丑数则计数器加1,否则遍历下一个整数。

(3)当计数器的值=N时,停止遍历,输出丑数。

##########################################################################################################

寻找丑数算法2:

从上一个丑数推断出下一个丑数,而不需要从1开始遍历再判断。从1开始的10个丑数分别为1,2,3,4,5,6,8,9,10,12。可以发现除了1以外,丑数都是由某个丑数*2或者*3或者*5得到的。如2是丑数1*2得到的,3是丑数1*3得到的,4是丑数1*4得到的,5是丑数1*5得到的,6是丑数2*3得到的……

具体算法步骤:

(1)从第一个丑数1开始,求出1*2=2 ,1*3=3 ,1*5 = 5;

(2)取上面乘积中大于1的最小值2,作为第二个丑数(丑数是个递增序列,所以第i+1个丑数一定比第i个丑数大)

(3)求丑数2之前的丑数与2、3、5的乘积:1*2=2 ,1*3=3 ,1*5 = 5; 2*2 = 4; 2*3 = 6; 2*5 =10;

(4)取上面乘积中大于2的最小值3,作为第三个丑数

……

(i)取出丑数i之前的丑数分别与2、3、5的乘积

(i+1)取乘积中大于i的最小值作为丑数

(i+2)重复(i)(i+1)的步骤直到计数器等于N

##########################################################################################################

问题一:判断一个数是否为丑数

python代码:

# -*- coding: utf-8 -*-
import sys# 判断一个数是否为丑数
def isUglyNumber(num):if num<=0:return Falseelif num>=1:for i in [2,3,5]:while num%i==0:num = num / iif num == 1:return Trueelse:return Falseif __name__ == '__main__':try:while True:arr = int(input())print(isUglyNumber(arr))except:pass

运行结果:

C++代码:

#include <iostream>
#include <vector>
using namespace std;//判断一个数是否为丑数
bool isUglyNumber(int num){vector<int> index = { 2, 3, 5 };if (num <= 0) return false;else if (num >= 1){for (int i = 0; i < 3; i++){while (num%index[i] == 0){num /= index[i];}}if (num == 1) return true;else return false;}}int main(){int num;while (1){cin >> num;bool index = isUglyNumber(num);if (index == true)cout << "True" << endl;elsecout << "False" << endl;}system("pause");return 0;
}

运行结果:

问题二:给定区间,输出丑数的个数或丑数

python 代码:

# -*- coding: utf-8 -*-
import sys# 判断一个数是否为丑数
def isUglyNumber(num):if num<=0:return Falseelif num>=1:for i in [2,3,5]:while num%i==0:num = num / iif num == 1:return Trueelse:return Falsedef getUglyNumber(lowIndex,highIndex):res = []if highIndex<=0: #如果区间右端点小于或等于0,则返回空列表return reselif lowIndex>=highIndex: #如果区间左端点大于或等于右端点,则返回空列表return reselif lowIndex<=0 and highIndex>0: #如果区间左端点小于或等于0,右端点大于0for i in range(1,highIndex+1):if isUglyNumber(i)==True:res.append(i)return reselif lowIndex>0 and highIndex>0: #如果区间左端点大于0,右端点大于0,且右端点大于左端点for i in range(lowIndex,highIndex+1):if isUglyNumber(i)==True:res.append(i)return resif __name__ == '__main__':try:while True:arr = [int(t) for t in sys.stdin.readline().split()]# 等价于 arr = [int(t) for t in input("").split()]res = getUglyNumber(arr[0],arr[1])# print(res) 输出格式为:如[1,2,3,4,5,6]if len(res)>=1:print(" ".join(str(i) for i in res))  # 输出列表元素,以空格为分隔符,且最后一个无空格else:print('no')except:pass

运行结果:


C++代码:

#include <iostream>
#include <vector>
using namespace std;//判断一个数是否为丑数
bool isUglyNumber(int num){vector<int> index = { 2, 3, 5 };if (num <= 0) return false;else if (num >= 1){for (int i = 0; i < 3; i++){while (num%index[i] == 0){num /= index[i];}}if (num == 1)return true;elsereturn false;}}// 获取第N个丑数
vector<int> getUglyNumber(int lowIndex, int highIndex){vector<int> res;// 如果区间右端点小于或等于0,则返回空向量if (highIndex <= 0) return res; // 如果区间左端点大于或等于右端点,则返回空列表else if (lowIndex >= highIndex) return res;// 如果区间左端点小于或等于0,右端点大于0else if (lowIndex <= 0 && highIndex > 0){for (int i = 1; i < highIndex + 1; i++){if (isUglyNumber(i) == true){res.push_back(i);}}}// 如果区间左端点大于0,右端点大于0else if (lowIndex > 0 && highIndex > 0){for (int i = lowIndex; i < highIndex + 1; i++){if (isUglyNumber(i) == true){res.push_back(i);}}}return res;
}int main(){vector<int> index(2),myRes;while (1){for (int i = 0; i < 2; i++){cin >> index[i];}myRes = getUglyNumber(index[0],index[1]);int len = myRes.size();// 求myRes长度if (len >= 1) {for (int j = 0; j < len; j++){cout << myRes[j] << " ";}cout << endl;}else{cout << "no" << endl;}}system("pause");return 0;
}

运行结果:


问题三:求第N个丑数

python代码1:

# -*- coding: utf-8 -*-
import sys# 判断一个数是否为丑数
def isUglyNumber(num):if num<=0:return Falseelif num>=1:for i in [2,3,5]:while num%i==0:num = num / iif num == 1:return Trueelse:return False# 获取第N个丑数
def getUglyNumber(N):count = 0 #用于计数if N<=0:return 0else:num = 1while (count<N):if isUglyNumber(num) == True:count = count + 1num = num + 1return num-1if __name__ == '__main__':try:while True:arr = int(input())print(getUglyNumber(arr))except:pass

运行结果:

C++代码1:

#include <iostream>
#include <vector>
using namespace std;//判断一个数是否为丑数
bool isUglyNumber(int num){vector<int> index = { 2, 3, 5 };if (num <= 0) return false;else if (num >= 1){for (int i = 0; i < 3; i++){while (num%index[i] == 0){num /= index[i];}}if (num == 1) return true;else return false;}}//获取第N个丑数
int getUglyNumber(int N){int count = 0;if (N <= 0) return 0;else{int num = 1;while (count < N){if (isUglyNumber(num) == true){count += 1;}num += 1;}return num - 1;}
}int main(){int num;while (1){cin >> num;cout << getUglyNumber(num) << endl;}system("pause");return 0;
}

运行结果:


python代码2:

import sysdef getUglyNumber(N):if N < 1:return 0res = [1]t2 = t3 = t5 = 0next = 1while next < N:min_num = min(res[t2] * 2, res[t3] * 3, res[t5] * 5)res.append(min_num)if res[t2] * 2 <= min_num:t2 += 1if res[t3] * 3 <= min_num:t3 += 1if res[t5] * 5 <= min_num:t5 += 1next += 1return res[N - 1]if __name__ == '__main__':try:while True:arr = int(input())print(getUglyNumber(arr))except:pass

运行结果如上,该方法在优于方法1。因此,在剑指offer上的剑指offer——丑数的提交python代码应为方法2,方法1不通过。

即:

# -*- coding:utf-8 -*-
class Solution:def GetUglyNumber_Solution(self, index):# write code hereif index < 1:return 0res = [1]t2 = t3 = t5 = 0next = 1while next < index:min_num = min(res[t2]*2, res[t3]*3, res[t5]*5)res.append(min_num)if res[t2]*2 <= min_num:t2 += 1if res[t3]*3 <= min_num:t3 += 1if res[t5]*5 <= min_num:t5 += 1next += 1return res[index-1]

提交结果:


C++代码:

#include <iostream>
#include <vector>
using namespace std;//返回三个数字里面的最小值
int min(int num1, int num2, int num3)
{int min = num1 < num2 ? num1 : num2;min = min < num3 ? min : num3;return min;
}//获取第N个丑数
int getUglyNumber(int N){if (N < 1) return 0;vector<int> res = { 1 };int t2 = 0;int t3 = 0;int t5 = 0;int next = 1;while (next < N){int min_num = min(res[t2] * 2, res[t3] * 3, res[t5] * 5);res.push_back(min_num);if (res[t2] * 2 <= min_num) t2 += 1;if (res[t3] * 3 <= min_num) t3 += 1;if (res[t5] * 5 <= min_num) t5 += 1;next += 1;}return res[N - 1];
}int main(){int num;while (1){cin >> num;int res = getUglyNumber(num);cout << res << endl;}system("pause");return 0;
}

同理,在剑指offer上的剑指offer——丑数的提交C++代码:

class Solution {
public:int min(int num1, int num2, int num3){int min = num1 < num2 ? num1 : num2;min = min < num3 ? min : num3;return min;}int GetUglyNumber_Solution(int index) {if (index < 1) return 0;vector<int> res = { 1 };int t2 = 0;int t3 = 0;int t5 = 0;int next = 1;while (next < index){int min_num = min(res[t2] * 2, res[t3] * 3, res[t5] * 5);res.push_back(min_num);if (res[t2] * 2 <= min_num) t2 += 1;if (res[t3] * 3 <= min_num) t3 += 1;if (res[t5] * 5 <= min_num) t5 += 1;next += 1;}return res[index - 1];}
};

提交结果:

参考网址:

1、https://blog.csdn.net/u013632190/article/details/52036119

2、https://blog.csdn.net/lzuacm/article/details/51336420

3、https://blog.csdn.net/my_mao/article/details/24366291

在线编程——丑数系列(pythonC++)相关推荐

  1. 六十六、丑数系列,丑的颠覆我的思想

    @Author:Runsen @Date:2020/9/28 取一粒跳跃的文字,镶进九月的诗篇,无论是水榭的一角,还是月下的花园,只要有岁月的空格,就能拼接出精美的图案. 纯数学家哈代说,美是检验数学 ...

  2. 从C语言的角度重构数据结构系列(八)-数据结构堆知识超级丑数

    前言 在这里给自己打个广告,需要的小伙伴请自行订阅. python快速学习实战应用系列课程 https://blog.csdn.net/wenyusuran/category_2239261.html ...

  3. 一、为了OFFER系列 | 阿里云天池赛在线编程:移动的圆

    @Author:Runsen 大四刷题拼offer系列,不拼不行啊 关于:阿里云天池赛在线编程的介绍. 阿里云天池赛在线编程:在线编程限时赛,参与刷题,提升能力,奖品多多,助你晋级拿offer! 本人 ...

  4. Anycodes,在线编程网站上线啦!支持六种编程语言,语法高亮,行数显示,和代码自动折叠。小伙伴们,请速度围观!

    Anycodes项目说明 项目名称:Anycodes 曾用名成:Anycodex 声明:     该项目,目前隶属于吉林市群龙科技有限公司,项目域名是anycodes.cn     该项目代码是原创, ...

  5. 牛客网——2017校招真题在线编程(pythonC++)

    牛客网--2017校招真题在线编程(python&C++) 1.n个数里的最小k个 题目描述 找出n个数里最小的k个 输入描述: 每个测试输入包含空格分割的n+1个整数,最后一个整数为k值,n ...

  6. java在线编程题_阿里笔试题(2017在线编程题)-- 数串分组 --Java实现

    看到有人写了阿里的面试题,心里痒痒,好久 没搞过这些了,写着实现一下 题目 2017年3月阿里在线编程题(实习内推) 给定一串数字 判断是否存在这三个元素,它们将数字串分为四个子串,其中每个子串的数字 ...

  7. 阿里笔试题(2017在线编程题)-- 数串分组 --Java实现

    看到有人写了阿里的面试题,心里痒痒,好久 没搞过这些了,写着实现一下 题目 2017年3月阿里在线编程题(实习内推) 给定一串数字 判断是否存在这三个元素,它们将数字串分为四个子串,其中每个子串的数字 ...

  8. 【Java】剑指Offer_编程题_丑数

    题目链接:https://www.nowcoder.com/questionTerminal/6aa9e04fc3794f68acf8778237ba065b 题目描述 把只包含质因子2.3和5的数称 ...

  9. MCU模拟JTAG接口对LATTICE CPLD FPGA 进行在线编程加载

    完整版请点击 https://hifpga.com/问题/719 索取源码,向博主本人提问FPGA相关问题 作者:Rock.Ding(莱迪思半导体公司) 关键字:MCU, JTAG, 在线编程, CP ...

最新文章

  1. Error running ‘xxx-web-order‘: Unable to open debugger port : java.net.Socke
  2. HTMLCollection元素的For循环
  3. 简述原型模型的特点_软件工程简答题答案 第五版
  4. java step1:基础知识5(java中Timer和TimerTask的使用)
  5. python文字教程-Python
  6. rocksdb和leveldb性能比较——写性能
  7. 教你如何使用EXCEL中的lookup函数(摘自“MS帮助和支持”)
  8. 史上最容易懂的云计算的前世今生
  9. 模糊搜索时搜索结果中关键词变为不同颜色
  10. 16岁成为全栈开发者:我从开发游戏到写加密货币投资机器人的心路历程
  11. wpf使用入式mysql_使用 WPF 和 MySQL 搭建小型人资管理系统——主要页面
  12. .NET 6新特性试用 | PriorityQueue
  13. HTML5特性system,HTML5教程 FileSystemAPI整理
  14. sqlserver 中的GUID 全局唯一标识 -摘自网络
  15. [转]WF事件驱动(1)
  16. 深入理解计算机系统李秋豪,《深入理解计算机系统》第7章:重定位PC相对引用的理解...
  17. Android 用代码Ping网络
  18. 基于SSM框架的考勤签到请假系统
  19. 【聚客通scrm】-微信个人号sdk实现的微信云控方案
  20. linux 6 dns,RHEL6下搭建DNS服务器

热门文章

  1. Mybatis动态数据源实现
  2. NNI启动失败, 提示ERROR: Restful server start failed 解决方案
  3. 非主流X86处理器的过去、现在
  4. 【电气安全】安科瑞电气火灾监控系统在江苏某大学中设计与应用
  5. 使用eaysexcel时里面的日期转换问题
  6. Keras快速上手——打造个人的第一个“圣诞老人”图像分类模型
  7. LeetCode -- 765.情侣牵手
  8. word文档中找不到服务器,【在WORD文件中插入excel表格,编辑保存后重新打开word文件并双击excel时提示“找不到服务器应用程序、源文件】excel整个表格不见了...
  9. 职称计算机考试word2003真题,全国职称计算机考试讲义·真题·预测三合一. Word2003中文字处理...
  10. Neutron网络设备命名规则