2015年6月7日 星期日

a058:MOD3 (21)

a058: MOD3 (21)

更新時間:2016/12/20
內容
  相信判斷一個數除以三的餘數是多少,對你來說應該沒有問題。那,如果一次請你判斷很多個數呢嘿嘿?給你n個數字,請你輸出3k、3k+1、3k+2的數各有幾個。
輸入說明
  第一行有一個正整數n,代表接下來有幾個數字,接著有n個介於1到50000之間的數字,請你做判斷。
輸出說明
  輸出三個數字(以空白隔開),分別為n個數字中,三的倍數、三的倍數+1、三的倍數+2的數量。
範例輸入
  5
  1
  2
  3
  4
  5
範例輸出
  1 2 2
提示
背景知識
  迴圈



想一想,再看解答~


我的解題想法
  使用5個變數儲存資料,分別為個數、暫存的數字、3的倍數的數量、3的倍數+1的數量和3的倍數+2的數量。我們知道次數,所以直接使用 for 迴圈,並在 for 迴圈內部取得數字且馬上分類計數。

程式碼
#include <stdio.h>
int main(void){
    int n,tmp,k0=0,k1=0,k2=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&tmp);
        tmp = tmp%3;
        tmp==0?k0++:(tmp==1?k1++:k2++);
    }
    printf("%d %d %d",k0,k1,k2);
    return 0;
}
程式碼解析
#1:引入標準輸入/輸出串流。
#2:主程式開始,回傳引數int,沒有參數。
#3:宣告5個整數(int)變數「n」、「tmp」、「k0」、「k1」、「k2」,範圍–2,147,483,648 到 2,147,483,647。
並且把 k0、k1 和 k2 初始化,初始值為 0 。
#4:從標準輸入讀取格式化數據。讀取1個整數(%d),指定值給「n」。
#5:迴圈 for 開始。區域變數「i」,從 1 開始到 n 結束 (int i=1;i<=n;i++)。
#6:從標準輸入讀取格式化數據。讀取1個整數(%d),指定值給「tmp」,一次讀取一個數字。
#7:計算此數字除以 3 的餘數存回「tmp」。
#8:判斷此數字除以 3 的餘數是否等於 0,如果是 k0 加 1,否則繼續判斷是否等於 1,如果是 k1 加 1,否則 k2 加 1。
#9:迴圈 for 結束。
#10:將格式化數據顯示到標準輸出。連續輸出3個整數,中間空格(%d %d %d),分別輸出「k0」、「k1」、「k2」。
#11:主程式回傳整數「0」。
#12:主程式結束。