---
tags: CSE
---
# HW4
## 題目說明
Objective :
學會使用 if/else、switch 敘述作程式邏輯判斷,並複合
for、while 進行迴圈運算。
### 4-1
18 世紀時,普魯士數學家哥德巴赫,在寫給朋友的信件中
提到:「任一大於 2 的偶數都可寫成兩個質數之和」,後
世稱之為哥德巴赫猜想。
請設計一個程式,輸入一介於4到 1000000 的偶數後,將
其拆分為兩個質數輸出。
**(提示:可先從質數判斷下手)
(注意:本題須以迴圈撰寫,且對錯誤輸入值做出處理)**
Input : 987412,-8,27
Output :



### 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


## 程式碼
**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了,
想知道更多就去問直屬吧