#3645: 逾時了...請幫我看看程式碼...謝(c++)


ttcto520 (Mario)

學校 : 喇沙書院(香港)
編號 : 8048
來源 : [218.102.169.155]
最後登入時間 :
2011-04-30 19:16:49
a010. 因數分解 | From: [219.77.25.250] | 發表日期 : 2010-04-16 19:26

#include <iostream>
using namespace std;

int is_prime(int number)
{
    if ( number == 2 || number == 3) return 1;
    else if (number == 1 || number % 2 == 0) return 0;
    for (int x = 3 ; x*x < number ; x+=2)
    if (number % x == 0) return 0;
    return 1;
}

int main()
{
    int n = 0;
    while ( cin >> n ){
    int *prime_factor = new int [n/2];
    int input = n;
    int index = 0;
    for (int test_value = 2 ; test_value <= n/2  ; test_value ++)
    {
        while ( is_prime(test_value) ) 
        {
            if (input % test_value == 0)
            {
                prime_factor[index] = test_value;
                input /= test_value;
                index++;
            }
            else
            break;
        }
    }
    if (index == 0) prime_factor[index++] = n;
    
    for (int counter = 0; counter < index ; counter ++)
    {
        static int count = 0;
        if ( prime_factor[counter] == prime_factor[counter+1])
             count++;
        else if ( (prime_factor[counter] != prime_factor[counter+1]) && count > 0 )
            {
                cout << prime_factor[counter] << "^" << count+1 << (counter+1 == index ? "" : " * ") ;
                count = 0;
            }
        else if (prime_factor[counter] != prime_factor[counter+1])
            cout << prime_factor[counter] << ( counter+1 == index ? "" : " * " );
    }
    cout << endl;
    delete [] prime_factor;
}
    return 0;
}
 
#3648: Re:逾時了...請幫我看看程式碼...謝(c++)


linishan (L)

學校 : 國立交通大學
編號 : 1090
來源 : [104.132.150.102]
最後登入時間 :
2019-05-10 19:57:54
a010. 因數分解 | From: [125.228.109.117] | 發表日期 : 2010-04-16 22:50

#include
using namespace std;

int is_prime(int number)
{
    if ( number == 2 || number == 3) return 1;
    else if (number == 1 || number % 2 == 0) return 0;
    for (int x = 3 ; x*x < number ; x+=2)
    if (number % x == 0) return 0;
    return 1;
}

int main()
{
    int n = 0;
    while ( cin >> n ){
    int *prime_factor = new int [n/2];
    int input = n;
    int index = 0;
    for (int test_value = 2 ; test_value <= n/2  ; test_value ++)
    {
        while ( is_prime(test_value) ) 
        {
            if (input % test_value == 0)
            {
                prime_factor[index] = test_value;
                input /= test_value;
                index++;
            }
            else
            break;
        }
    }
    if (index == 0) prime_factor[index++] = n;
    
    for (int counter = 0; counter < index ; counter ++)
    {
        static int count = 0;
        if ( prime_factor[counter] == prime_factor[counter+1])
             count++;
        else if ( (prime_factor[counter] != prime_factor[counter+1]) && count > 0 )
            {
                cout << prime_factor[counter] << "^" << count+1 << (counter+1 == index ? "" : " * ") ;
                count = 0;
            }
        else if (prime_factor[counter] != prime_factor[counter+1])
            cout << prime_factor[counter] << ( counter+1 == index ? "" : " * " );
    }
    cout << endl;
    delete [] prime_factor;
}
    return 0;
}


沒時間細讀程式  (太長 解讀有點花時間..)

 

這題最快的做法是建一個sqrt(1000000)=1000的質數表 (質數表又可以以一種 差不多O(n)超快的時間建好)

針對讀進來的數字 找尋質數表內的數字是否可整除

除到最後 如果不是1 則必為質數 -> 輸出

 
ZeroJudge Forum