AcWing 866 試除法判定質數

2021-10-01 16:39:35 字數 1079 閱讀 4011

題目描述:

給定n個正整數ai,判定每個數是否是質數。

輸入格式

第一行包含整數n。接下來n行,每行包含乙個正整數ai。

輸出格式

共n行,其中第 i 行輸出第 i 個正整數ai是否為質數,是則輸出「yes」,否則輸出「no」。

資料範圍

1≤n≤100, 1≤ai≤2∗10^9

輸入樣例:

2

26

輸出樣例:

yes

no

分析:

質數的判定是數論中最基礎的質數。首先,1既不是質數也不是合數,只能被1和自身整除的整數稱為質數。所以一般採用試除法來判斷質數,常規的是從2到n列舉除數,一旦n能被i整除,說明n不是質數。這種辦法的時間複雜度為o(n),而且往往需要特判n為2的情形。

不妨先回憶下整除的定義:若整數b除以非零整數a,商為整數,且餘數 為零, 我們就說b能被a整除(或說a能整除b),b為被除數,a為除數,即a|b(「|」是整除符號),讀作「a整除b」或「b能被a整除」。a叫做b的約數(或因數),b叫做a的倍數。

由i | n,可以推出 (n / i) | n,所以如果n有個約數是小於根號n的,那麼必定存在另乙個約數大於根號n,反之,試除法過程中除到根號n了還沒有找到n的因子,說明大於根號n的數也不會有n的因子,故可以只列舉根號n個數,時間複雜度也是根號n。

迴圈的寫法:for(int i = 2;i <= n / i;i++)。下面說下其它幾種寫法的缺點,for(int i = 2;i <= sqrt(n);i++),每次迴圈都要執行sqrt函式,效率低,當然可以先令t = sqrt(n),迴圈時i不超過t即可。另一種寫法是for(int i = 2;i * i <= n;i++)這種情況當n足夠大時,乘法運算可能發生溢位。所以一般寫出i <= n / i的形式或者先求出sqrt(n)。

#include using namespace std;

bool isprime(int n)

return true;

}int main()

return 0;

}

866 回文素數

求出大於或等於n的最小回文素數。回顧一下,如果乙個數大於 1,且其因數只有 1 和它自身,那麼這個數是素數。例如,2,3,5,7,11 以及 13 是素數。回顧一下,如果乙個數從左往右讀與從右往左讀是一樣的,那麼這個數是回文數。例如,12321 是回文數。示例 1 輸入 6輸出 7示例 2 輸入 8...

AOJ 866 飛越原野 BFS

在一片廣闊的土地上,有乙個鳥人,他需要從這裡穿過原野,回到基地。這片原野上,有平地 p 有湖泊 l 因為鳥人可以飛,所以呢,有的時候,他可以飛越湖泊。現在,鳥人需要用最快的時間,回到基地。假設原野是乙個m n的矩陣,有兩種地形,用p和l表示。鳥人只能停留在平地上。他目前處在 1,1 這個位置,而目的...

素數 回文數 Leecode 866

求出大於或等於 n 的最小回文素數。回顧一下,如果乙個數大於 1,且其因數只有 1 和它自身,那麼這個數是素數。例如,2,3,5,7,11 以及 13 是素數。回顧一下,如果乙個數從左往右讀與從右往左讀是一樣的,那麼這個數是回文數。例如,12321 是回文數。示例 1 輸入 6 輸出 7 示例 2 ...