2019年12月20日 星期五

P2T a007判斷質數

方法一: 判斷是否被  2 ~ 根號n 整除 , 但在 zerojudge的 a007仍會 TLE
    1 算出 q = int(sqrt(n))
    2 for i=2 ~ q ,若 n 被 i 整除則非質數
    3  i ~ q 皆不整除就是質數

方法二:先建一個質數表pr 再判斷是否被 2 ~ q 之內的質數整除 {大約會快10倍}
     (一)建 2~46340之間的質數表,共有4792個質數,最小是2、最大是 46337
           vector <int> pr;
     pr.push_back(2);           // 2 是質數,直接加入 pr
     for( i=3; i<=46340; i+=2 )  // 只判斷奇數是否為質數
     {
        q = int( sqrt(i) );
        bool y = 1;   //以下 判斷 i 是否被質數表中的質數整除
        for(j=0; y && j<pr.size() && pr[j]<=q ; ++j)
              if( i % pr[j] == 0 ) y=0;
        if( y ) pr.push_back(i);   // i 也是質數
     }
    註:vector<資料型別 > 可說是記憶空間動態調整的陣列
            不需 int pr[ 須先宣告大小 ]; 當有新資料時 pr.push_back( 新資料 );
            總共有幾個元素可由 pr.size() 的值查詢

     (二) 每輸入的 n 只檢查 2~q 中的質數是否可整除 n 可加快速度
           while( cin >> n ) //有  20 萬筆 n
     {
        q = int( sqrt(n) );
        bool y = 1;   //以下 判斷 n 是否被質數表中的質數整除
        for(j=0; y && j<pr.size() && pr[j]<=q ; ++j)
              if( n % pr[j] == 0 ) y=0;
        if( y ) cout << "質數\n";  // 印出質數
        else  cout << "非質數\n";  // 印出非質數
     }

I/O 加速: cin,cout 會比 scanf,printf慢,可改為如下
        while( scanf("%d", &n)==1 ) //有  20 萬筆 n
    {
       …
       if( y ) printf("質數\n");  
       else  printf("非質數\n");    
    }


Related Posts:

  • 普一普二C++基礎題 a004 C++考試以 zerojudge 實作方式進行 C++上機實作 (非 open book) 即不可帶講義 但會提供常用的英文字及程式基本架構,例 #include <iostream> using namespace std; in… Read More
  • P2段2模考段2模考下載… Read More
  • P2第一段進度P2A , P2B  資訊進度                                    &nbs… Read More
  • P2段3進度範圍2019/6/6補 加考題範例 課內練習、習作解 342頁 1.B 2.C 3.網路電子地圖 345頁 1.D 2.B 350頁 1.A 2.C 3.AR 351頁 1.D 2.A 3.D 4.B 5.C 6.D 7.B 8.D 9.A 10.D 363頁 1.C 2.B 3.數位落差 368頁… Read More
  • P2 ch11 最後有 c11補充題 p2_Ch11(-1&-2) _課內  1.               ( D ) 楊宗緯、林宥嘉、周定緯……等… Read More

0 意見:

張貼留言