#1547: 沒人回答的TLE,跪求高手...


timmymike (超小小蝦米)

學校 : 中原大學
編號 : 2130
來源 : [61.219.23.150]
最後登入時間 :
2023-01-30 16:17:23
a010. 因數分解 | From: [219.80.34.154] | 發表日期 : 2009-03-13 15:01

程式碼:

 # include <iostream>
# include <stdlib.h>
# include <math.h>

using namespace std ;

bool IsPrime( int num ) {
// num代表待測數

  int sqrtnum = (int)sqrt( (double)num ) ;
  // 此時要開始檢察sqrt到num是不是原num的因數

  if ( sqrtnum == 1 && num != 1 ) // 2、3都是質數
    return true ;
  else if ( num == 1 )
    return false ;
  else {
    for ( int i = sqrtnum ; i > 1 ; i -- )
      if ( num%i == 0 ) // 代表小於 sqrtnum的數有數字是num的因數
        return false ;
 
    return true ;
  } // else
} // IsPrime()


int PrimeSeries( int num ) {
// 傳入一個序列數,傳出這個序列數的質數
// 如1是2,2是3,3是5,4是7,5是11
 

  int theprime = 2 ;

  for ( int i = 1 ; i < num  ; i ++ ) {
    theprime ++ ;
    while ( ! IsPrime( theprime ) ) { // 找到theprime真真正正是質數為止。    
      theprime ++ ;
    } // while
  
  } // for

  return theprime ;

} // PrimeSeries()

int main() {


  int reduce = 0, i = 1, reducenums = 1  ; // 預備做質因數分解
                                           // 其實reduce是垃圾分解的意思(囧)
   
  bool first = true ;

  while ( cin >> reduce  ) {

    first = true ;

    while ( reduce != 1 ) {
   
      if ( ! first )
        cout << " * " ;
      // 先找最小的質數分解他
     
      i = 1 ;

      for ( ; reduce % PrimeSeries(i) != 0  ; i ++ ) ;
     
      cout << PrimeSeries( i ) ; // 找到了,印出來
   
      reduce /= PrimeSeries( i )  ;

      reducenums = 1 ; // 可以被除的次數 // 已經檢查過一次了,所以初始值是1
  
      // 如果可以繼續用同一個數分解的話就繼續
      if ( reduce % PrimeSeries( i ) == 0  ) {
        cout << "^"  ;
     
        while ( reduce % PrimeSeries(i) == 0  ) {
          reduce /= PrimeSeries( i )  ;
          reducenums ++ ;
        } // while

      cout << reducenums ;

      } // if

      first = false ;

    } // while
  

    cout << endl ;
  } // while


  return 0 ;

} // main()


/*
還是TLE...請問我的演算法有可以改進的空間嗎?

我的演算法:
1.找到第一個可以把待測數字除掉的數,然後除掉,並接著除,看可以除掉幾次

2.接著找,直到待測數字被除到1

我知道我這個演算法有一個問題就是如果有待測數有很大的質因數(如155114),就要找很久。
可是我不知道如何解決這個問題。

有好心的高手大人,可以幫我解決這個問題嗎?或換個更好的演算法給我?

*/

 
#1550: Re:沒人回答的TLE,跪求高手...


sagit (sagit)

學校 : 國立臺中女子高級中學
編號 : 1457
來源 : [211.23.3.219]
最後登入時間 :
2024-06-13 10:01:48
a010. 因數分解 | From: [211.74.180.40] | 發表日期 : 2009-03-13 19:02

/*
還是TLE...請問我的演算法有可以改進的空間嗎?

我的演算法:
1.找到第一個可以把待測數字除掉的數,然後除掉,並接著除,看可以除掉幾次

2.接著找,直到待測數字被除到1

我知道我這個演算法有一個問題就是如果有待測數有很大的質因數(如155114),就要找很久。
可是我不知道如何解決這個問題。

有好心的高手大人,可以幫我解決這個問題嗎?或換個更好的演算法給我?

*/

1.既然你知道判斷質數時只要做到 sqrt(num) 就行了,
那麼在求質因數分解時, 也只要求到 sqrt(num) 以下的質因數就行了,
如果不是變成1, 那剩下的部分也是一個質數....

2.你的 PrimeSeries() 呼叫太多次, 效率會變很差,
可以一開始就把質數表建好, 之後直接查表就行了....

3.事實上, 不用建質數表也行, 也不用去判斷是不是質數,
你就用 2、3、4、5、.... 一直除上去,
除到 sqrt(num) 為止, 假設你要分解的數是 66=2*3*11,
雖然有一個因數是 6, 但是因為之前已經把 2 的因數都除掉了,
所以遇到 6 時就不會整除, 自然會跳過這個數....

 
#1563: Re:沒人回答的TLE,跪求高手...


timmymike (超小小蝦米)

學校 : 中原大學
編號 : 2130
來源 : [61.219.23.150]
最後登入時間 :
2023-01-30 16:17:23
a010. 因數分解 | From: [219.80.34.154] | 發表日期 : 2009-03-17 14:28

謝謝你的回答!得到AC了!

 
ZeroJudge Forum