題目:

讓使用者輸入一個整數,並輸出該數是否為質數

解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
#include<cmath>
using namespace std;

int main()
{
int x, a = 0, b = 0; //a=非質數;b=質數;
cin >> x;//待檢查數

if(x==0||x==1)
{
cout << "不是質數" << endl;
}
else
{
for (int i = 2; i < sqrt(x);i++)
{
if(x%i == 0)
{
a++;//代表有除了1的因數,且是此i值
}
else if(x%i != 0)
{
b++;//代表此i值不是x的因數
}
}
}

if(a>=1)
{
cout << "不是質數" << endl;
}
else
{
cout << "是質數" << endl;
}

}

解釋與詳細介紹

第一部分:for迴圈介紹

1
2
3
4
5
//initial expression
for(cond-expression)
{
//loop-expression
}

for迴圈是程式中很常出現的一個語法,通常在for前面會出現代表這個迴圈的初始設定,本題就是當程式執行到else內部才會開始執行for,而在括號中的cond-expression則代表了執行loop-expression的條件,當其為true時才會執行loop,舉例而言

1
2
3
4
for(int i = 0; i < 2; i++ )
{
cout << i;
}

這個程式中的判斷標準變是以”當下的變數i”是否小於二去執行cout<<i”的指令與次數。因此在程式執行時,依序在

i=0,因為此時的i=0 < 2,因此他會先印出”0”,而後進行了i++也可寫作i=i+1,代表i值增加1
i=1,因為此時的i=1 < 2,因此他會印出”1”而後進行了i++
i=2,因為此時的i=2 !< 2,!代表”不”的意思,因此他會結束這個loop且不會印出任何東西

所以這段程式的結果便會呈現”01”。

我們很常運用for loop配合if else、while與其他迴圈去實現我們想執行的程式邏輯。

第二部分:主功能解析

由題目可得知

input:為一個整數值
output:呈現他是否為”質數”的結果,這裡我們用string(字串)的方式印出成果

我們先另x=輸入數,a,b分別作為其為”非質數”與”質數”的代表。並用第一個if條件將x=0和1的情形排除,並在else的條件中逐一判定i由2~(根號x)-1的範圍內是否有出現”任何一次”i為x因數的情況(因為質數定義為因數只有自己和1),若是有,則代表他不是質數,那就會使代表”是此i的倍數”=”非質數”的a++;否之則會使代表”不是此i的倍數”的b++,並一直重複這個過程到結束。最後再由a的值來判斷便可以得出結論。

**小技巧:**因為其最大質因數必不會超過本身開根號的答案,加上這個條件可以有效降低程式的時間複雜度,也就是使執行效率更快

第三部分:成果展示

https://ithelp.ithome.com.tw/upload/images/20220907/20151593MHLbY6kwXZ.png

參考資料:

https://docs.microsoft.com/zh-tw/cpp/cpp/for-statement-cpp?view=msvc-170