---
# System prepended metadata

title: HW4
tags: [CSE]

---

---
tags: CSE
---
# HW4
## 題目說明
Objective :
學會使用 if／else、switch 敘述作程式邏輯判斷，並複合
for、while 進行迴圈運算。
### 4-1
18 世紀時，普魯士數學家哥德巴赫，在寫給朋友的信件中
提到：「任一大於 2 的偶數都可寫成兩個質數之和」，後
世稱之為哥德巴赫猜想。
請設計一個程式，輸入一介於４到 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
對所有正整數ｎ，定義一函數 f(n)為 n 的所有數字加總，若
反覆將加總結果代入函數中，則最後可得到一個位數。
例如：
n＝1234，則 f(n)＝1＋2＋3＋4＝10，f(f(n))＝1＋0＝1。
請設計一個程式，輸入一不大於 2ｘ10
9的正整數ｎ，計算
並輸出符合題意之結果。

**（注意：本題須以迴圈撰寫，且對錯誤輸入值做出處理）**

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了，
想知道更多就去問直屬吧