经典算法详解(9)寻找丑数

简介: 题目:我们把只含有因子2、3、5的数称为丑数。例如6、8都是丑数,而14不是丑数,因为它含有因子7.通常也把1当做丑数。编程找出1500以内的全部丑数。注意:使用的算法效率应尽量高。C++实现: 1 #include 2 3 using namespace std; 4 5 //判...

题目:我们把只含有因子2、3、5的数称为丑数。例如6、8都是丑数,而14不是丑数,因为它含有因子7.通常也把1当做丑数。编程找出1500以内的全部丑数。注意:使用的算法效率应尽量高。

C++实现:

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 //判断一个数是否是丑数,uglynum=2*2……*2*3*3*……*3*5*5……*5组成
 6 int isUglyNumber(int n) {
 7     while (n%2==0)
 8     {
 9         n /= 2;
10     }
11     while (n%3==0)
12     {
13         n /= 3;
14     }
15     while (n%5==0)
16     {
17         n /= 5;
18     }
19     return n == 1;
20 }
21 //方法1:逐个判断是否是丑叔,思路简单,但是计算冗余,因为越到后面很多都不是丑数也在计算。
22 int get_Ugly_fir(int number) {
23     int i = 1;
24     int count = 0;
25     while (i<=number)
26     {
27         if (isUglyNumber(i)) {
28             cout << i << "\t";
29             count++;
30             if (count % 10 == 0)
31                 cout << endl;
32         }
33         i++;
34     }
35     return count;
36 }
37 
38 //方法二:算法效率高。
39 //思路:(1)后面的丑数肯定是已存在的丑数乘以2、3或者5,找到比现有丑数大的且是最小的丑数作为下一个丑数(如何找是关键)。
40 //2分别从现有丑数中从前往后乘以丑数,找到第一个大于当前所有丑数的值以及位置,3、5同样如此,再把他们相乘之后的结果做对比,取最小的。
41 //下次将从上一次的位置开始往下找,这样将不会出现冗余,详细见如下函数。
42 
43 int Next_Ugly(int ugly_arr[], int *loc2, int *loc3, int *loc5, int *index) {
44     while (ugly_arr[*loc2] * 2 <= ugly_arr[*index]) {    //千万注意这里是小于等于,不要写成小于了
45         (*loc2)++;
46     }
47     while (ugly_arr[*loc3] * 3 <= ugly_arr[*index]) {
48         (*loc3)++;
49     }
50     while (ugly_arr[*loc5] * 5 <= ugly_arr[*index]) {
51         (*loc5)++;
52     }
53     if (ugly_arr[*loc2] *2< ugly_arr[*loc3]*3) {
54         return (ugly_arr[*loc2] * 2 < ugly_arr[*loc5] * 5) ? ugly_arr[*loc2] * 2 : ugly_arr[*loc5] * 5;
55     }
56     else {
57         return (ugly_arr[*loc3] * 3) < ugly_arr[*loc5] * 5 ? ugly_arr[*loc3] * 3 : ugly_arr[*loc5] * 5;
58     }
59 }
60 
61 int get_Ugly_sec(int num) {
62     int ugly_arr[1000];
63     int index = 0, value = 1;
64     int loc2=0, loc3=0, loc5=0;
65     while (value<=num) {
66         ugly_arr[index] = value;
67         cout << ugly_arr[index] << "\t";
68         if ((index + 1) % 10 == 0)
69             cout << endl;
70         
71         value = Next_Ugly(ugly_arr, &loc2, &loc3, &loc5, &index);
72         index++;
73     }
74     return index;
75 }
76 
77 int main(int argc, char *argv[]) {
78     get_Ugly_fir(1500);
79     cout << endl;
80     get_Ugly_sec(1500);
81     getchar();
82     return 0;
83 }

(1)说明:总共使用了两种办法,第一种算法效率低,编程简单,第二种算法效率高,编程相对复杂。

(2)方法二思路:后面的丑数肯定是已存在的丑数乘以2、3或者5,找到比现有丑数大的且是最小的丑数作为下一个丑数(如何找是关键)。用2分别从现有丑数中从前往后乘以丑数,找到第一个大于当前所有丑数的值以及位置,3、5同样如此,再把他们相乘之后的结果做对比,取最小的。下次将从上一次的位置开始往下找,这样将不会出现冗余。

相关文章
|
算法 前端开发
前端算法-丑数
前端算法-丑数
|
存储 算法 C++
【每日算法Day 81】面试经典题:关于丑数,你真的理解为什么这么算吗?
【每日算法Day 81】面试经典题:关于丑数,你真的理解为什么这么算吗?
|
算法 C++
|
算法
算法题每日一练---第76天:丑数 l
丑数 就是只包含质因数 2、3 和 5 的正整数。
153 1
算法题每日一练---第76天:丑数 l
|
算法
【刷算法】丑数
【刷算法】丑数
|
算法 Java C++
LeetCode(算法)- 264. 丑数 II
LeetCode(算法)- 264. 丑数 II
82 0
|
存储 算法
[leetcode/lintcode 题解] 阿里算法面试真题:丑数 II · Ugly Number II
[leetcode/lintcode 题解] 阿里算法面试真题:丑数 II · Ugly Number II
[leetcode/lintcode 题解] 阿里算法面试真题:丑数 II · Ugly Number II
|
算法
每日一道算法题-寻找丑数
  题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。
1120 0
|
8天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
14天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。