写在前面
本文之用途是记录本人在学习过程中所遇到的问题、总结经验,而不是教程。若能为您提供帮助我将感到万分荣幸。若您发现问题,还请指出,我将不胜感激!
若不想看前面的解析,可以一拉到底直接看完整代码。
-----------------------------------------------分割线-----------------------------------------------
问题描述
给出n个数,找出这n个数的最大值,最小值,和。
输入格式
第一行为整数n,表示数的个数。
第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。
输出格式
输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。
样例输入
5
1 3 -2 4 5
样例输出
5
-2
11
解题思路
分析问题,此程序需要编写以下功能模块:
- 求最大值
- 求最小值
- 求和
- 给数组每个元素赋值(写在主函数中)
实现步骤
- 求最大值
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 dataBuffer[MAXLENGTH];
int i = 0, ktest = 0, count = 0;
while (scanf("%d", &dataBuffer[i++]))
{
if (getchar() == '\n')
break;
}
count = i;
这个段代码本身没有问题,但是不适合用来解决本道题目。蓝桥的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)
- 完整代码
#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;
}
蓝桥训练系统评测结果: