PAT-乙-1012 1012 数字分类 (20 分)

在这里插入图片描述
在这里插入图片描述

代码1(c++)

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	long a[5]= {0, 0, 0, 0, 0};
	int seq1 = 1;
	long sum2 = 0L;
	double avg3 = 0.0;
	for(int i=0; i<n; i++) {
		int t;
		scanf("%d", &t);
		int remain = t%5;
		switch(remain) {
			case 0:
				if(t%2==0) {
					a[0] = a[0] + t;
				}
				break;
			case 1:
				if(seq1%2) {
					sum2 += t;
				} else {
					sum2 -= t;
				}
				a[1]++;
				seq1++;
				break;
			case 2:
				a[2]++;
				break;
			case 3:
				a[3]++;
				avg3 += t;
				break;
			case 4:
				if(t>a[4]) {
					a[4] = t;
				}
				break;
		}
	}
	if(a[0]==0) {
		printf("N");
	} else {
		printf("%d", a[0]);
	}
	for(int i=1; i<5; i++) {
		if(i==3 && a[i]!=0) {
			printf(" %.1lf", avg3/(double)a[3]);
		}
		else if(i==1 && a[i]!=0) {
			printf(" %ld", sum2);
		} else {
			if(a[i]==0) {
				printf(" N");
			} else {
				printf(" %d", a[i]);
			}
		}
	}
	return 0;
}

注解1

(1)练习switch case的使用

switch(变量名) {
    			case 0:   break;
    			case 1:   break;
    			default:
       }

(2) A2= 将被 5 除后余 1 的数字按给出顺序进行交错求和,此处有一个坑点:a1-a2+a3-a4…,有可能最后得到的结果是0!所以初始化为0就不太合适。
优化办法:a数组该元素在初始化时,将其赋值为-1或其他不可能出现的数。

代码2(c++,vector版本)

#include <iostream>
#include <vector>

using namespace std;

int main() {
	int n;
	cin>>n;
	vector< vector<int> > v(5);
	for(int i=0; i<n; i++){
		int t;
		cin>>t;
		if(t%5==0){
			if(t%2==0){
				v[0].push_back(t);
			}
		}
		else{
			v[t%5].push_back(t);
		}
	}
	
	//reminder = 0
	int ans = 0;
	for(int i=0; i<v[0].size(); i++){
		if(v[0][i]%2==0){
			ans += v[0][i];
		}
	}
	if(v[0].size()==0){
		printf("N");
	}
	else{
		printf("%d", ans);
	}
	
	//reminder = 1
	ans = 0;
	for(int i=0; i<v[1].size(); i++){
		if(i%2==0){
			ans += v[1][i];
		}
		else{
			ans -= v[1][i];
		}
	}
	if(v[1].size()==0){
		printf(" N");
	}
	else{
		printf(" %d", ans);
	}
	
	//reminder = 2
	if(v[2].size()==0){
		printf(" N");
	}
	else{
		printf(" %d", v[2].size());
	}
	
	//reminder = 3
	double re = 0.0;
	for(int i=0; i<v[3].size(); i++){
		re += v[3][i];
	}
	if(v[3].size()==0){
		printf(" N");
	}
	else{
		printf(" %.1lf", re/(double)v[3].size());
	}
	
	//reminder = 4
	ans = -1;
	for(int i=0; i<v[4].size(); i++){
		if(v[4][i]>ans){
			ans = v[4][i];
		}
	}
	if(v[4].size()==0){
		printf(" N");
	}
	else{
		printf(" %d", ans);
	}
	
	printf("\n");
	
	return 0;
}

注解2

(1)采用vector的方法,要学会用二重的vector。
声明: vector< vector > v(5);
相当于二维数组(5行,不指定列)。使用时,v[i].push_back(num);
v[i].at(index);
(2)不足:代码可以进一步优化,变短!

猜你喜欢

转载自blog.csdn.net/zhanggirlzhangboy/article/details/82820529