#24791: C語言 小弟使用邏輯稍難的解法,請教各位大神更好更快更簡潔的解法


toitp (Toitp)

學校 : 不指定學校
編號 : 150438
來源 : [203.71.117.18]
最後登入時間 :
2024-11-15 12:48:50
a010. 因數分解 | From: [111.246.94.218] | 發表日期 : 2021-03-26 07:16

#include <stdio.h>

void factz(int num);

int main()

{

    int num;

    scanf("%d", &num);

    factz(num);

 

    return 0;

}

 

void factz(int num)

{

    int div, i;

    int isprime = 1; //假設這個數是質數

    for (div=2; div*div<=num; div++) //因數不用從2找到num,只要找到根號num就可以了

    {

        if (num%div == 0)  

        {

            if (isprime == 0) printf(" * ");  //如果之前isprime的狀態沒有被改變過,代表這是我們找到的第一個因數,所以就不用印 * 號在前面

            isprime = 0;  //一旦找到因數了,就代表這個數不再是質數了

            printf("%d", div);

            num = num/div;

            i=1;

            while (num%div==0) //看看這個因數能不能反覆除該數多次,並且用i紀錄我們除了幾次,這個i將會是次方

            {

                num = num/div;

                i++;

            }

            if (i>1) printf("^%d", i); //如果次方大於1就印出該因數可以除幾次

        }

    }

    if (isprime) printf("%d", num);  //最後的最後,如果上面都沒找到半個因數,就是質數,則印出自己

    else if (num != 1) printf(" * %d", num); //要不然,有因數的話就把最後除以因數後的商印出來,如果商是1就不用印了

}

 

 
#24806: Re:C語言 小弟使用邏輯稍難的解法,請教各位大神更好更快更簡潔的解法


fire5386 (becaidorz)

學校 : 國立清華大學
編號 : 115822
來源 : [140.114.253.147]
最後登入時間 :
2024-10-03 15:39:22
a010. 因數分解 | From: [61.230.25.117] | 發表日期 : 2021-03-26 22:48

判斷質數的地方可以改

你用++i,但是其實偶數(除了2以外)都一定不是值數,所以不用考慮

可以改成:

bool isprime(int n) {

    if(n == 1)

        return 0;

    if(n & 1) {

        int mx = sqrt(n) + 1;

        for(int i = 3; i <= mx; i += 2)

            if(!(n % i))

                return 0;

        return 1;

    }

    return (n == 2);

}

 
ZeroJudge Forum