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

来源:互联网 发布:mac本取消开机密码 编辑:程序博客网 时间:2024/06/09 23:40

263. Ugly Number

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>




0 0
原创粉丝点击