--- tags: CSE --- # HW4 ## 題目說明 Objective : 學會使用 if/else、switch 敘述作程式邏輯判斷,並複合 for、while 進行迴圈運算。 ### 4-1 18 世紀時,普魯士數學家哥德巴赫,在寫給朋友的信件中 提到:「任一大於 2 的偶數都可寫成兩個質數之和」,後 世稱之為哥德巴赫猜想。 請設計一個程式,輸入一介於4到 1000000 的偶數後,將 其拆分為兩個質數輸出。 **(提示:可先從質數判斷下手) (注意:本題須以迴圈撰寫,且對錯誤輸入值做出處理)** Input : 987412,-8,27 Output : ![](https://i.imgur.com/1kgGDSl.png =40%x) ![](https://i.imgur.com/j5GYi5k.png =40%x) ![](https://i.imgur.com/cg1s9wX.png =40%x) ### 4-2 對所有正整數n,定義一函數 f(n)為 n 的所有數字加總,若 反覆將加總結果代入函數中,則最後可得到一個位數。 例如: n=1234,則 f(n)=1+2+3+4=10,f(f(n))=1+0=1。 請設計一個程式,輸入一不大於 2x10 9的正整數n,計算 並輸出符合題意之結果。 **(注意:本題須以迴圈撰寫,且對錯誤輸入值做出處理)** Input:1234 Output:1 ![](https://i.imgur.com/MaVPtMa.png =40%x) ![](https://i.imgur.com/ukX47yg.png =40%x) ## 程式碼 **4-1** ```c= int num; printf("請輸入大於2的偶數 :"); scanf("%d", &num); if (num % 2 != 0 || num < 4 || num >1000000) { printf("錯誤的輸入值"); return 0; } ``` 先根據題目要求宣告變數並用if-else對其進行判斷, 若num不是偶數或num小於4或num大於1000000, 就輸出"錯誤的輸入值"並return 0結束程式。 ```c=9 int a, b, i, check, check2; ``` 宣告一些變數等等會用到 ```c=10 for(a=2;a<=num/2;a++) { check = 0; for(i=2;i<a-1;i++) { if(a%i == 0) { check++; break; } } if(check == 0) { b = num - a; check2 = 0; for(i=2;i<b-1;i++) { if(b%i == 0) { check2++; break; } } if(check2 == 0) { printf("%d = %d + %d", num, a, b); break; } } } ``` 不知道怎麼切所以先把程式碼全部貼出來==。 介紹一下各個變數分別代表什麼, a代表兩質數中較小的那個質數 b代表兩質數中較大的那個質數 check和check2分別是a和b的確認點,等等會提到, i則是作為裡面迴圈的初值。 先從最外面的for迴圈開始看好了, 假設這裡的**num=50**, 作為較小質數的a會從2開始找 (因為1不是質數), 所以for迴圈的初值為a=2。 那為什麼num可以除以2呢? (其實有沒有除以2好像都一樣==) 因為沒有必要找到25(num/2)以後的數, a在大於b之前就會找到答案了 (猜想為真的話)。 再來是迴圈裡的第一行check=0, 意指每一次尋找的確認點都要歸零, 否則上一次的尋找會影響到下一次尋找 (check已經大於1)。 ```c for(i=2;i<a-1;i++) { if(a%i == 0) { check++; break; } } ``` 這是大for迴圈裡面的第一個小for迴圈, 目的是判斷a是否為質數, a%i若為0則代表a有除了1與自身以外的因數,即a並非質數。 check++則接到下面的判斷 ```c if(check == 0) ``` 若check為0 (即a為質數), 則接續if裡面的程式碼。 ```c b = num - a; check2 = 0; ``` 因為a+b需要剛好等於num, 所以先將b設為num - a, 再來判斷是否為質數, 若b也是質數則滿足題目所求, 所以第二個小for迴圈程式碼跟判斷a是否為質數一模一樣,就不解釋了。 ```c if(check2 == 0) { printf("%d = %d + %d", num, a, b); break; } ``` 最後若判斷b也是質數,則印出最後的答案, 完成4-1。 ### 4-2 ```c=1 int n, sum; printf("請輸入一正整數:"); scanf("%d", &n); if(n>2000000000) { printf("錯誤的輸入值"); return 0; } ``` 先把基本的打出來, n負責記錄輸出的數字,sum負責記錄最後的結果。 ```c=11 while(n>0) { while(n!=0) { sum += n%10; n /= 10; } if (sum>=10) { n = sum; sum = 0; } } ``` 這部分就是計算,外面的迴圈負責檢測n是否要繼續進行計算, 而裡面的迴圈則將n裡的每一個位數(從最後一位開始取出)加到sum裡面,所以最後要輸出的答案變數是sum而不是n。 若sum是兩位數以上就讓n繼續進行計算迴圈,end。 最後記得自己輸出。 接下來的不會更了因為有ChatGPT了, 想知道更多就去問直屬吧