題目描述
輸入一個偶數 N N N,驗證 4 ~ N 4\sim N 4~N 所有偶數是否符合哥德巴赫猜想:任一大于 2 2 2 的偶數都可寫成兩個質數之和。如果一個數不止一種分法,則輸出第一個加數相比其他分法最小的方案。例如 10 10 10, 10 = 3 + 7 = 5 + 5 10=3+7=5+5 10=3+7=5+5,則 10 = 5 + 5 10=5+5 10=5+5 是錯誤答案。
輸入格式
第一行輸入一個正偶數 N N N
輸出格式
輸出 N ? 2 2 \dfrac{N-2}{2} 2N?2? 行。對于第 i i i 行:
首先先輸出正偶數 2 i + 2 2i+2 2i+2,然后輸出等號,再輸出加和為 2 i + 2 2i+2 2i+2 且第一個加數最小的兩個質數,以加號隔開。
樣例 #1
樣例輸入 #1
10
樣例輸出 #1
4=2+2
6=3+3
8=3+5
10=3+7
提示
數據保證,$ 4 \leq N\leq10000$。
1.題目分析
輸入一個偶數,代表右邊界,從4到有邊界遍歷每一個偶數,輸出每一個偶數的兩個質數之和,保證左邊的質數最小化。
說一下質數的判斷方法:不能夠被1以外的任何自身的因子整除。
2.題目思路
寫一個判斷質數的函數,輸入N,寫一個數組存儲N以內的所有質數,
用一個三層循環,第一層代表4到N的偶數,第二層代表第一個質數的遍歷,第三層代表第二個質數的遍歷,
然后判斷偶數等于兩個質數之和的情況,打印即可。
值得一提的是,第一個質數應該小于第二個質數,
遍歷到一組和的時候,需要直接結束本輪最外部的偶數循環。
3.代碼實現
#include <stdio.h>
#include <math.h>//判斷質數的函數
int isPrimer(int n) {int flag = 1;//對1和0進行特判if (n == 1 || n == 0) {flag = 0;}for (int i = 2; i <= sqrt(n); ++i) {if (n % i == 0) {//可以被自身整除則不為質數flag = 0;}}return flag;
}int main() {int n;scanf("%d", &n);//存放n以內所有的質數int arr[n];int cnt = 0;for (int j = 2; j < n; ++j) {//存放質數if (isPrimer(j) == 1) {arr[cnt] = j;cnt++;}}//跳出內部循環的標記int flag = 1;//遍歷偶數for (int i = 4; i <= n; i += 2) {for (int j = 0; j < cnt; ++j) {flag = 1;for (int k = j; k < cnt; ++k) {//判斷質數之和等于偶數if (arr[j] + arr[k] == i) {printf("%d=%d+%d\n", i, arr[j], arr[k]);flag = 0;}}//當本輪偶數找到質數和之時,跳出本輪if (flag == 0) {break;}}}return 0;
}