您的位置:首页 > 其它

Leetcode ☞ 263. Ugly Number ☆ 【附求质数 prime number 最大公约gcd 最小公倍lcm】

2016-03-01 16:10 567 查看


263. Ugly Number

Question

Total Accepted: 44350 Total
Submissions: 123594 Difficulty: Easy

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: