蓝桥杯基础练习7 数列特征

写在前面

本文之用途是记录本人在学习过程中所遇到的问题、总结经验,而不是教程。若能为您提供帮助我将感到万分荣幸。若您发现问题,还请指出,我将不胜感激!
若不想看前面的解析,可以一拉到底直接看完整代码。
-----------------------------------------------分割线-----------------------------------------------

问题描述

给出n个数,找出这n个数的最大值,最小值,和。

输入格式

第一行为整数n,表示数的个数。

第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。

输出格式

输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。

样例输入

5
1 3 -2 4 5

样例输出

5
-2
11

解题思路

分析问题,此程序需要编写以下功能模块:

  1. 求最大值
  2. 求最小值
  3. 求和
  4. 给数组每个元素赋值(写在主函数中)

实现步骤

  1. 求最大值
int max(int a[],int n){
	int i,max=*a;//将数组第一个元素的值赋给max
	for(i=1;i<n;i++){//从第二个元素开始与max比较
		if(a[i]>=max){   
			max=a[i];
		}
	}
	return max;
}
  1. 求最小值
int min(int a[],int n){
	int i,min=*a;//将数组第一个元素的值赋给min
	for(i=1;i<n;i++){//从第二个元素开始与max比较
		if(a[i]<=min){
			min=a[i];
		}
	}
	return min;
}
  1. 求和
int sum(int a[],int n){
	int i,sum=0;
	for(i=0;i<n;i++){//基础的求和算法
		sum+=a[i];
	}
	return sum;
}
  1. 给数组每个元素赋值
    按照题目要求,待输入的数据是一行用空格分隔的数字。如果你在百度上搜索输入一组用空格隔开的数并录入到一个数组,那么可能你常见的会是这样的算法:
    int dataBuffer[MAXLENGTH];
    int i = 0, ktest = 0, count = 0;
    while (scanf("%d", &dataBuffer[i++]))
    {
        if (getchar() == '\n')
            break;
    }
    count = i;

来源:scanf读入一行数据, 并将其中的数字录入数组问题

这个段代码本身没有问题,但是不适合用来解决本道题目。蓝桥的Online Judger限制运行时间为1.0s,若采用该算法将导致运行超时,像这样:

我经过调试,定位到了导致运行效率降低的语句:if (getchar() == '\n')
针对此题,做出如下修改:

	int i=0,n;
	int m[10000];//用来储存数列
	scanf("%d",&n);//数列的项数
	
    while (scanf("%d", &m[i++]))
    {
       if(i==n)          
            break;
    }

变量 i 的值数列的项数 n 的值相等,便可以认为数列的所有元素都录入到数组中,所以我将if (getchar() == '\n')改成了if(i==n)

  1. 完整代码
#include <stdio.h>
#include <stdlib.h>
//求最大值
int max(int a[],int n){
	int i,max=*a;//将数组第一个元素的值赋给max
	for(i=1;i<n;i++){//从第二个元素开始与max比较
		if(a[i]>=max){   
			max=a[i];
		}
	}
	return max;
}
//求最小值
int min(int a[],int n){
	int i,min=*a;//将数组第一个元素的值赋给min
	for(i=1;i<n;i++){//从第二个元素开始与max比较
		if(a[i]<=min){
			min=a[i];
		}
	}
	return min;
}
//求和
int sum(int a[],int n){
	int i,sum=0;
	for(i=0;i<n;i++){
		sum+=a[i];
	}
	return sum;
}

int main(){
	int i=0,n;
	int m[10000];//用来储存数列
	scanf("%d",&n);//数列的项数
	
    while (scanf("%d", &m[i++]))
    {
       if(i==n)          
            break;
    }
	printf("%d\n",max(m,n));
	printf("%d\n",min(m,n));
	printf("%d\n",sum(m,n));
	return 0;
}

蓝桥训练系统评测结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44019157/article/details/104403548
今日推荐