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

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>




你可能感兴趣的:(Leetcode ☞ 263. Ugly Number ☆ 【附求质数 prime number 最大公约gcd 最小公倍lcm】)