創作內容

2 GP

高中生程式解題系統 - a007:判斷質數(C語言實作)

作者:PM2011│2015-01-03 11:51:32│巴幣:4│人氣:1587
這題我也解好久,放置了三年吧...@@
然後今天才解出來....

其實還有找到一個看起來更厲害的AKS檢驗法,
但他不能接受29以上(含)的質數判斷,不然會溢位....- -|||


正文
使用C語言實作。
解答狀況AC (1.7s, 1.2MB)


說明:
下述程式使用埃拉托斯特尼篩法建質數表,並以其進行運算。
質數範圍為2~小於等於最大數的開根號向上取整的質數
此程式最大數為2,147,483,647,故其根號向上取整為46,341,程式中的數皆不會大於46,341。
如質數表中數字皆無法整除輸入資料,就可以判斷其為質數。


程式碼如下:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
  int input[200000], input_count = 0, max = 0;
  while(scanf("%d", &input[input_count]) != EOF)
  {/* 讀取輸入 */
    if(max < input[input_count])/* 判定最大數 */
      max = input[input_count];
    input_count++;/* 更新輸入資料數 */
  }
  
  int i
  , max_sqrt = ((int)ceil(sqrt(max)))/* 最大數開根號,小數無條件進位 */
  , table[max_sqrt]/* 確定質數表大小 */
  , table_count = 0;/* 質數表資料數 */
  
  table[table_count++] = 2;/* 先將2加入質數表中,並更新資料數 */
  for(i = 3; i <= max_sqrt; i += 2)
  {/* 只對奇數篩選,到最大數的開根號,建質數表 */
    int j, flag = 0;
    for(j = 0; j < table_count; j++)
    {
      if(i % table[j] == 0)
      {/* 判斷新數字是否可以被質數表數字整除 */
        flag = 1;
        break;
      }
    }
    if(!flag)
    {/* 無法被整除,加入數質數表 */
      table[table_count++] = i;/* 新數字加入質數表,並更新資料數 */
    }
  }
  
  for(i = 0; i < input_count; i++)
  {/* 處理輸入資料 */
    int j, flag = 0;
    for(j = 0; j < table_count &&input[i] > table[j] ; j++)
    {/* 將輸入除以小於自身的質數 */
      if(input[i] % table[j] == 0)
      {/* 被整除,為合數,結束運算 */
        flag = 1;
        break;
      }
    }
    if(flag)
    {
      printf("非質數\n");
    }
    else
    {
      printf("質數\n");
    }
  }
  return 0;
}

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2704276
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:程式|解題系統|程式碼|C語言|C|陣列|迴圈|質數|埃拉托斯特尼篩法|建表

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

2喜歡★abc5593449 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:高中生程式解題系統 - ... 後一篇:高中生程式解題系統 - ...

追蹤私訊切換新版閱覽

作品資料夾

aaa1357932大家
各位有空可以來我家看看畫作或聽聽我的全創作專輯!看更多我要大聲說昨天09:39


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】