【PAT B1012】数字分类 (C语言)

在这里插入图片描述

#include <stdio.h>
#define	MAX_N 1000							/* 最多输入1000个数 */ 
#define NON_EXIST 32766						/* A1-A5 不存在*/
#define ADD		1							/* A2要交错加减 */
#define MINUS	0							/* A2要交错加减 */
/* 将lim个数读入数组read[]中,并将除以5的余数存到re中 */
void read_re_N(int read[], int re[], int lim){
	int i;

	for(i = 0; i < lim; ++i){
		scanf("%d", &read[i]);
		re[i] = (read[i] % 5);
	}
}
void calcu_A1_A5(int s[], int re[], int lim){
	int i, A1, A2, A3, A5;
	int A2_flag = ADD;
	float A4, A4_sum = 0;					/* 求平均数的总和 */
	int A4_count = 0;						/* 求平均数:余数为3的数有几个 */

	A1 = A2 = A3 = A4 = A5 = NON_EXIST;
	for(i = 0; i < lim; ++i){
/* 计算A1 = 能被5整除的数字中所有偶数的和 ************************************/
		if(re[i] == 0 && (s[i] % 2) == 0){	/* 余数为零, 且为偶数 */
			if(A1 == NON_EXIST)
				A1 = s[i];
			else
				A1 += s[i];
/* 计算A2 = 将被5除后余1 的数字按给出的顺序交错求和,即n1-n2+n3-n4...*********/
		}else if(re[i] == 1){				/* 余数为1 */
			if(A2 == NON_EXIST){
				A2 = s[i];
				A2_flag = MINUS;			/* 下一个余数为一的数要减 */
			}else{
				if(A2_flag == MINUS){
					A2 -= s[i];
					A2_flag = ADD;
				}else{
					A2 += s[i];
					A2_flag = MINUS;
				}
			}
/* 计算A3 = 被5除后余2的数字的个数 ******************************************/
		}else if(re[i] == 2){				/* 余数为2 */
			if(A3 == NON_EXIST)
				A3 = 1;
			else
				++A3;
/* 计算A4 = 被5除后余3的数字的平均数,精确到小数后1位 ***********************/
		}else if(re[i] == 3){				/* 余数为3 */
				A4_sum += s[i];				/* A4 = A4_sum / A4_count */
				++A4_count;
/* 计算A5 = 被5除余4的数字中最大的数字 **************************************/
		}else if(re[i] == 4){				/* 余数为4 */
			if(A5 == NON_EXIST)
				A5 = s[i];
			else
				if(s[i] > A5)
					A5 = s[i];
		}
	}
/* 输出A1-A5 *****************************************************************/
	if(A4_sum != 0)							/* 先计算一下A4 */
		A4 = A4_sum / A4_count;
	if(A1 != NON_EXIST)						/* A1存在 */
		printf("%d ", A1);					
	else									/* A2不存在 */
		printf("N ");						
	if(A2 != NON_EXIST)						/* A2存在 */
		printf("%d ", A2);
	else									/* A2不存在 */
		printf("N ");
	if(A3 != NON_EXIST)						/* A3存在 */
		printf("%d ", A3);
	else									/* A3不存在 */
		printf("N ");
	if(A4 != NON_EXIST)						/* A4存在 */
		printf("%.1f ", A4);
	else									/* A4不存在 */
		printf("N ");	
	if(A5 != NON_EXIST)						/* A5存在 */
		printf("%d", A5);
	else									/* A5不存在 */
		printf("N");
}
int main(){
	int array[MAX_N] = {0};					/* 记录读入的数 */
	int re[MAX_N] = {-1};					/* 记录读入的数除以5的余数 remainder */
	int N;									/* 要读入多少个数 */

	scanf("%d", &N);			
	read_re_N(array, re, N);				/* 将这N个数,读入数组array, 计算余数re  */
	calcu_A1_A5(array, re, N);				/* 计算A1-A5 并输出 */
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值