花了點時間改寫並且加了註解, 若還是連看都看不懂, 我認為你該被當。
我直接給你答案, 老實說這跟作弊沒兩樣了。
複製程式
#include <stdio.h>
#include <math.h> // 因為有用到 sqrt(),所以才宣告。
int p(int i) // 此為判斷是否為質數之副程式,若輸入值為質數便回傳 1,否則回傳 0。
{
int x = (int)sqrt((double)i), r = 1, l; // 對'輸入質i'開根號,然後儲存於'變數x'。
for (l = 3; l <= x; l += 2)
{if (i % l == 0) r = 0;}
return r;
}
int q(int a, int b) // a 是'輸入值a',b 是'輸入值b'。
{
int r = 1, l; // r 是運算結果,若輸入值ab區間有雙生質數便設為 0 ,否則為 1 ,l 是’迴圈計數變數’。
if (!(a & 1)) a += 1; // 以及閘來作邏輯判斷,若'輸入值a'是偶數就加 1 ,使其變為奇數。
for (l = a; l < b; l += 2) // 單純只考慮奇數(因為除了 2 不可能有質數同時為偶數的情況),故迴圈每次不只加 1 而是加 2。
{
if (p(l)) // 呼叫'副程式p'來判斷’迴圈計數變數’是否為質數。
{
if (p(l + 2)) // 若’迴圈計數變數’是質數便再呼叫'副程式p'來判斷’迴圈計數變數’ + 2 是否也為質數。
{
printf("%d\t%d\n", l, l + 2); // 輸出雙生質數。
r = 0;
}
}
}
r ? printf("此範圍內無雙生質數\n==========\n") : printf("==========\n"); // 若輸入值ab區間無雙生質數便輸出'此範圍內無雙生質數=========='的訊息,否則只輸出'=========='的訊息。
}
int main(void)
{
int a, b, l; // a 是'輸入值a',b 是'輸入值b',l 是迴圈計數變數。
while (scanf("%d", &a) == 1) // 讀取鍵盤輸入的數值並儲存為'輸入值a'。
{
if (a == -1) return 0; // 若'輸入值a'是 -1 便結束此程式。
scanf("%d", &b); // 讀取鍵盤輸入的數值並儲存為'輸入值b'。
a < 2 ? printf("請注意! a一定要大於或等於2。\n==========") : a < b ? q(a, b) : q(b, a); // 若'輸入值a'小於 2 便輸出錯誤訊息,否則就將'輸入值a'與'輸入值b'交由'副程式q'來處理。
}
return 0;
}