數字分類 (20 分)
阿新 • • 發佈:2021-02-13
技術標籤:PTA
一、題目簡介
輸入格式:
每個輸入包含 1 個測試用例。每個測試用例先給出一個不超過 1000 的正整數 N,隨後給出 N 個不超過 1000 的待分類的正整數。數字間以空格分隔。
輸出格式:
對給定的 N 個正整數,按題目要求計算 A1~A5並在一行中順序輸出。數字間以空格分隔,但行末不得有多餘空格。
若其中某一類數字不存在,則在相應位置輸出 N。
輸入樣例 1:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
輸出樣例 1:
30 11 2 9.7 9
輸入樣例 2:
8 1 2 4 5 6 7 9 16
輸出樣例 2:
N 11 2 N 9
二 、思路與程式碼
**思路:**因為我們需要記錄出現數字次數以及每個分類的最終結果,所以我們直接使用一個二維陣列來儲存最終結果,一個記錄結果一個記錄個數。我們對每一個數字進行分類,再分別對應不同的操作,並把相應的計數加一。
情況一,將偶數相加求和。
情況二,設定一個標誌位,每次將這個標誌位取負並乘以運算元再相加。
情況三,將陣列記錄的數字加一。
情況四,直接求和,最終輸出的時候除以個數就行(不可以四捨五入)
情況五,每次遇到更大的數字就更新為更大的數字。
程式碼:
#include <stdio.h>
int flag = 1;
int getRes(int A[][2],int n);
void printRes(int A[][2]);
int main(){
int A[5][2] = {0};
A[4][0] = 0xffffffff;
int n, temp;
scanf("%d", &n);
while(n--){
scanf("%d", &temp);
getRes(A, temp);
}
printRes(A);
return 0;
}
// 列印資訊
void printRes(int A[][2]){
for (int i = 0; i < 5; i++){
if (i > 0){
printf(" ");
}
// 判斷是否有此類的個數
if(A[i][1] == 0){
printf("N");
}else{
if(i != 3){
printf("%d", A[i][0]);
}else{ // 對於第四類需要特殊對待
printf("%0.1f", A[3][0]*1.0/A[3][1]);
}
}
}
}
// 五類操作
int getRes(int A[][2],int n){
switch(n % 5){
case 0:
if(n % 2 == 0){
A[0][0] += n;
A[0][1]++;
}
break;
case 1:
A[1][0] += (flag * n); // 每次相乘取負,保證題目要求
A[1][1]++;
flag = -flag;
break;
case 2:
A[2][0]++;
A[2][1]++;
break;
case 3:
A[3][0] += n;
A[3][1]++;
break;
case 4:
if(n > A[4][0]){ // 記錄最大值
A[4][0] = n;
A[4][1]++;
}
break;
}
}