iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
自我挑戰組

用 C & C++ 帶你手把手解 UVa 一顆星選集系列 第 27

Day 0x1B UVa10922 2 the 9s

題意

  • 輸入一正整數 N,判斷是否為 9 的倍數及輸出 nine-degree
  • 需要注意的有:
    1. 重複輸入一正整數 N 直到 0 (最大到 1000 位)
    2. 什麼是 nine-degree
      • 根據 9 的倍數判別法 (跟 3 一樣),檢查位元總和是不是 9 的倍數,並重複計算有幾次總和是 9 的倍數
      • e.g. 837 = 8 + 3 + 7 = 18 = 9 x 2 → 一次
        18 = 1 + 8 = 9 = 9 x 1 → 兩次
        nine-degree = 2
    3. 輸出格式
      • N is a multiple of 9 and has 9-degree D.
      • N is not a multiple of 9.

解法

  • 起手式 while 迴圈重複輸入 N,直到讀進 0;因為數字可能很大,用字串方式讀入存到字元陣列中
    int main(){
    
        char N[1001] = {0};
    
        while(scanf("%s", N)){
            if(N[0] == '0' && strlen(N) == 1){
                break;
            }
            else{
                ...
            }
        }
    
        return 0;
    }
    
  • main() 處理好輸出格式
    printf("%s ", N);
    
    int D = degree(N);
    
    if(D){
        printf("is a multiple of 9 and has 9-degree %d.", D);
    }
    else{
        printf("is not a multiple of 9.");
    }
    
    printf("\n");
    
  • 自訂 function 計算有多少次總和為 9 的倍數;先過濾掉只有 '9' 的時候,只要長度 ≧ 2 就代表是 10 以上,所以還有機會計算總和;每次都 for 迴圈遍歷字元計算總和,只要 % 9 == 0 代表即為 9 的倍數,並更新次數;再透過 sprintf() 這個神奇的函式把整數轉回字元陣列繼續計算
    int degree(char *str){
    
        int i;
        int multiple, D = 0;
    
        if(strlen(str) == 1 && str[0] == '9'){
            return 1;
        }
    
        while(strlen(str) >= 2){
    
            multiple = 0;
    
            for(i = 0; i < strlen(str); i++){
                multiple = multiple + str[i] - '0';
            }
    
            if(multiple % 9 == 0){
                D++;
            }
    
            sprintf(str, "%d", multiple);
        }
    
        return D;
    }
    
  • C code
    #include<stdio.h>
    #include<string.h>
    
    int degree(char *str){
    
        int i;
        int multiple, D = 0;
    
        if(strlen(str) == 1 && str[0] == '9'){
            return 1;
        }
    
        while(strlen(str) >= 2){
    
            multiple = 0;
    
            for(i = 0; i < strlen(str); i++){
                multiple = multiple + str[i] - '0';
            }
    
            if(multiple % 9 == 0){
                D++;
            }
    
            sprintf(str, "%d", multiple);
        }
    
        return D;
    }
    
    int main(){
    
        char N[1001] = {0};
    
        while(scanf("%s", N)){
            if(N[0] == '0' && strlen(N) == 1){
                break;
            }
            else{
    
                printf("%s ", N);
    
                int D = degree(N);
    
                if(D){
                    printf("is a multiple of 9 and has 9-degree %d.", D);
                }
                else{
                    printf("is not a multiple of 9.");
                }
    
                printf("\n");
            }
    
            memset(N, 0, sizeof(N));
        }
    
        return 0;
    }
    

上一篇
Day 0x1A UVa10931 Parity
下一篇
Day 0x1C UVa10420 List of Conquests
系列文
用 C & C++ 帶你手把手解 UVa 一顆星選集30

尚未有邦友留言

立即登入留言