讓我們定義 dn 為:dn = pn+1 - pn,其中 pi 是第i個素數。顯然有 d1=1 且對於n>1有 dn 是偶數。「素數對猜想」認為「存在無窮多對相鄰且差為2的素數」。
現給定任意正整數n (< 105),請計算不超過n的滿足猜想的素數對的個數。
輸入格式:每個測試輸入包含1個測試用例,給出正整數n。
輸出格式:每個測試用例的輸出佔一行,不超過n的滿足猜想的素數對的個數。
輸入樣例:
20輸出樣例:
4自己的實現思想:
首先從2開始到給定正整數(肯定大於2)中取得所有素數,動態存放在陣列中。
然後遍歷陣列並比較相鄰兩個元素差,如果為2,則計數器+1。
實現**如下:
#include #include #include int isprime(int num)
}return 1;
}int primenumber(int number)
}free(p);
int primecount = 0;
for (int i = 0; i < count - 1; i++)
}return primecount;
}int main(void)
isprime函式判斷指定數字是否為素數,如果是素數返回1,否則返回0。
判斷依據是從2到n-1相除,如果餘數為0則說明不是素數。
primenumber函式是執行主體。
宣告動態陣列存放素數。
迴圈陣列並進行比較輸出。
執行結果如下:
insert number: 20
p[0] = 2
p[1] = 3
p[2] = 5
p[3] = 7
p[4] = 11
p[5] = 13
p[6] = 17
p[7] = 19
p[2] - p[1] = 5 - 3 = 2
p[3] - p[2] = 7 - 5 = 2
p[5] - p[4] = 13 - 11 = 2
p[7] - p[6] = 19 - 17 = 2
result is 4
之後在網上找到了更簡潔有效的**:
#include #include #include #include #define maxn 100000
int a[maxn];
int isprime(int num);
int main()}}
printf("%d",cnt2);
return 0;
}int isprime(int num)
return flag;
}
定義了最大整數100000
並以該整數為界限建立陣列的全域性變數。
使用memset對陣列進行初始化(清零)。
cnt1用來指示素數個數,同時作為陣列下標。a[2] = 2,所以i從3開始,cnt1從3開始。
cnt2指示滿足素數對條件的元素個數。
在迴圈中首先判斷是否是素數,如果是素數則放入陣列中。
在判斷到是素數時,在將當前素數與陣列中前乙個素數相減(因為陣列下標從3開始,下標為2的值為2,所以陣列中肯定存在前乙個元素)。
如果結果為2,則將素數對計數器+1。
該段**優點:
只迴圈一次即實現題目要求。**簡潔。
在判斷素數時使用平方根,減少迴圈次數。
(基於合數一定至少有乙個不大於sqrt(num)的約數的理論)
執行結果如下:
20
4
PAT 自測2 素數對猜想
自測 2 素數對猜想 20分 讓我們定義dnd n 為 dn pn 1 pnd n p n 1 p n 其中pip i 是第i i個素數。顯然有d1 1d 1 1,且對於n 1 n 1有dnd n 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 105 10 5 請計算...
自測2 素數對猜想
讓我們定義 dn 為 dn pn 1 pn,其中 pi 是第i個素數。顯然有 d1 1 且對於n 1有 dn 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 105 請計算不超過n的滿足猜想的素數對的個數。輸入格式 每個測試輸入包含1個測試用例,給出正整數n。輸出格式 ...
自測 2 素數對猜想
讓我們定義d n 為 d n p n 1 p n 其中p i 是第i個素數。顯然有d 1 1,且對於n 1有d n 是偶數。素數對猜想 認為 存在無窮多對相鄰且差為2的素數 現給定任意正整數n 10 5 請計算不超過n的滿足猜想的素數對的個數。輸入格式 輸入在一行給出正整數n。輸出格式 在一行中輸出...