簡體   English   中英

處理素數分解時出現問題

[英]there's a problem when dealing with prime factorization

我已經完成了這個練習,它是關於找出一個數字是否“丑陋” 如果一個數字只有 2、3 或 5 作為因數,那么它就是丑陋的。 否則,它並不難看。

這是我的解決方案:

include <stdbool.h>
#include <math.h>
bool is_prime(unsigned int num) {
    bool result = false;
    for (unsigned int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) {
            result = false; 
        }
        else {
            result = true; 
            
        }
    }
    return result; 
}


bool is_ugly(unsigned int num) {
    bool result = false; 
    for (unsigned int i = 1; i <= num; i++) {
        if (num % i == 0) {
            if (is_prime(i)) {
                if (i != 2 || i != 3 || i != 5) {
                    result = false; 
                    break; 
                }
                else {
                    result = true; 
                    break; 
                }
            }
        }
    }
    return result; 
}


int main(void) {

    bool result = is_ugly(30); // it must return true;  
    return 0; 
}

is_ugly function 的工作方式如下:

  • 它找到一個因子,然后它使用 is_prime function 來確定它是否是一個主要因子。 然后,我認為如果最終數字不等於 2 或 3 或 5(它是 boolean 邏輯),那么它是錯誤的,因為這意味着至少有另一個數字並且它使初始表達式(回想一下,A如果它只有 2、3 或 5 作為因子,則 number 是丑陋的。) false。 但它不起作用,因為當我用 30 運行算法時它返回 false,當它應該返回 true 時,因為 30 = 2 * 3 * 5。為什么?

你的方法太復雜了。

您只需要檢查一個數字是否僅包含除數 2、3 和 5。

所以 function is_prime只是多余的。 此外,它有一個錯誤,因為對於數字 2,它返回 false。

function is_ugly 可以看起來很簡單。 例如

bool is_ugly( unsigned int n ) 
{
    if ( n != 0 ) 
    {
        n = max_divide( n, 2 );
        n = max_divide( n, 3 );
        n = max_divide( n, 5 );
    }

    return n == 1'
} 

依次調用的 function max_divide 可以看如下方式

unsigned int max_divide( unsigned int n, unsigned int divisor ) 
{
    if ( n != 0 ) 
    {
        while ( n % divisor == 0 ) 
        {
            n /= divisor;
        }
    }

    return n;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM