Write a program to check whether a given number is an ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 6, 8
are ugly while 14
is not ugly since it includes another prime factor 7
.
Note that 1
is typically treated as an ugly number.
我的AC:
<span style="font-size:18px;">bool isUgly(int num) { if (num < 1) return false; for(int i = 2 ; i <= 5 ; i++){ while(num % i == 0) num /= i; } if (num == 1) return true; else return false; }</span>
分析:
将数依次除以2、3、5,除到不能整除为止,如果商不为1,说明有别的因子。
附求素数算法:
判断一个数num是否是素数,只要让num被2~根num之间的数除,如果不能被2~根num中的任何一个数整除,则num为素数。
【为何只需循环到根num? 其实想一想就明白了。 这个问题的答案又有点跟 Leetcode ☞ 319. Bulb Switcher ☆ 类似了】
bool isPrime(int num) { int k = sqrt(num); if (num == 2 || num == 3) return true; for(int i = 2 ; i <= k ; i++){ if (num % i == 0) return false;//不是素数 } return true; }
由素数又想到了 最小公倍数Lowest Common Multiple 最大公约数Greatest Common Divisor..
最小公倍数 = 两整数的乘积 ÷ 最大公约数,所以统一为求最大公约。
方法:辗转相除
非递归:
<span style="font-size:18px;">//最大公约数,非递归,辗转相除(先让a为大数再循环;把b赋给a,把余数赋给b;循环到b=0为止,)。 int gcd(int a, int b){ int tmp; if(a < b){ a = a ^ b; b = b ^ a; a = a ^ b; } while(b){ tmp = a % b; a = b; b = tmp; } return a; }</span>
递归:
<span style="font-size:18px;">//递归,ab谁大谁小无所谓。【如果a<b,第一轮就会相交换】 int gcd(int a,int b){ return a % b ? gcd(b, a % b) : b;// 或者 b ? gcd(b, a % b) : a; }</span>