APCS 實作題 10603 第1題秘密差參考解法

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

此題在高中生程式解題系統的題號為:c290: APCS 2017-0304-1秘密差

筆者將解法依照子題組的給分方式分別解題:

第 1子題組 20 分: X 一定恰好四位數 。
只要用除法與餘數運算子,分別求出個位數字和百位數字的和以及十位數字與千位數字的和即可。

C 程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>

int main(void) {
    int n;

    while(scanf("%d", &n))
    {
        int a = n %10 + n / 100 % 10;       // 個位數字與百位數字的和
        int b = n / 1000 + n / 10 % 10;     // 十位數字與千位數字的和

        printf("%d\n", (a > b? (a-b):(b-a)));
    }

    return 0;
}

第 2子題組 30分: X的位數不超過 9。
用除法與餘數運算子,分別求出奇數位數字的和以及偶數位數字的和即可。

Python 程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
while True:
    try:
        n = int(input())
        a = 0
        b = 0
        while(n > 0):
            a = a + n % 10          # 奇數位數的和
            b = b + n // 10 % 10    # 偶數位數的和
            n = n // 100

        print(abs(a - b))
    except EOFError:
        break

第 3子題組 50 分: X的位數不超過 1000 。
用字串來解。例如輸入的數字為 3217478967458012345689 時,而此數字的字串索引如下圖所所示:


Python 程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import math

while True:
    try:
        n = input()
        a = 0
        b = 0
        i = 0
        for c in n:
            if i % 2 == 0:
                a = a + int(c)
            else:
                b = b + int(c)
            i = i + 1
        
        print(abs(a - b))
    except EOFError:
        break

C 程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>

int main(void) {
  const int MAX = 1001;
  char num[MAX];
  int sLen = 0;
  int a, b, i;

  while(scanf("%s", num) != EOF) {
    sLen = strlen(num);
    a = 0, b = 0;

    for(i = 0; i < sLen; i += 2)
        a += (num[i] - '0');

    for(i = 1; i < sLen; i += 2)
        b += (num[i] - '0');

    printf("%d\n", a > b ? (a-b):(b-a));
  }

  return 0;
}

C++ 程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>

using namespace std;

int main(void) {
  string n;
  int sLen = 0;
  int a, b, i;

  while(cin >> n) {
    sLen = n.length();
    a = 0, b = 0;

    for(i = 0; i < sLen; i += 2)
        a += (n[i] - '0');

    for(i = 1; i < sLen; i += 2)
        b += (n[i] - '0');

    cout << (a > b ? (a-b):(b-a)) << endl;
  }

  return 0;
}


滿分的解法會是哪一個呢?