# Swust oj
题目描述:
输入N个数字,判断其中连续5个数的最大值,连续的定义为按输入顺序,数列尾和数列首我们也认为是连续的,输入数据保证只会出现一组最大值
输入:
N:以下有N个数字(N小于100个) N个数字输入
输出:
见SAMPLE OUTPUT
样例输入
20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
样例输出
The position is 16,17,18,19,20
The numbers are 16,17,18,19,20
The MAX is 90
解答:
解决这题首先要弄懂题目,即n个数字中,取5个连续输入的数字,将他们求和,判断和最大的那一组,并且分别输出最大值(和),他们所处的输入次序,具体是哪些数字等等。
代码未做优化,可能有点繁琐,大家有意见欢迎提问!
接下来代码展示:
#include<bits/stdc++.h>
using namespace std;
int main()
{
//输入n然后连续输入n个数字,将这n个数字存到数组a中。
int n;
cin>>n;
int a[n];
int i=0;
for(;i<n;i++)
{
cin>>a[i];
}
int max=0; //max变量,用于保存连续5个数字的和(和最大的那一组)
int ps; //定义一个ps(position),用来确定位置。
for(i=0;i<n;i++) //for循环从0开始,即从数组a的a【0】位置开始找起,如第一次循环为a0,a1,a2,a3,a4;
{ //第二次循环为a1,a2,a3,a4,a5,依次类推,但是当遇到第五个数字超出数组下标(n-1)时,
// 要想办法让它接着从1开始数起,如an,a1,a2,a3,a4这组。
int sum=0; //sum用于保存五个数字的和
int cnt=0; //cnt为一个计数器,使while循环只执行5次。
int j=i; //由于需要满足第20行注释的要求,所以定义一个j,使得j的改变不引起i的变化。
while(cnt<5) //循环5次,从而实现get5个连续数字
{
if(j==n) //当j加到n时,而数组下标最大为n-1,所以加到n时我们让j变为0则可实现第20行的注释
{
j=0;
}
sum+=a[j];
cnt++; //每次循环记得让计数器cnt+1
j++; //还有j(数组下标)记得加一
}
if(sum>max) //每次循环都判断一下和是否大于max,一旦大于就保存到max,
{ //但同时记得保存此时的这个最大这组的位置,即保存到ps。
max=sum;
ps=i;
}
}
int ps2=ps; //ps的值传给ps2,主要是防止改变ps的大小。
//下面的两段循环是同类型的操作,只不过一个是循环输出数组里存的值,一个是输出数组下标
//以之前找到的ps(ps2)为首
int cnt=0;
cout<<"The position is ";
while(cnt<5)
{
if(ps2==(n+1))
{
ps2=1;
}
if(cnt==4)
{
cout<<ps2+1<<endl;
}
else
cout<<ps2+1<<",";
ps2++;
cnt++;
}
cnt =0;
cout<<"The numbers are ";
while(cnt<5)
{
if(ps==n)
{
ps=0;
}
if(cnt==4)
{
cout<<a[ps]<<endl;
}
else
cout<<a[ps]<<",";
ps++;
cnt++;
}
cout<<"The MAX is "<<max<<endl;
return 0;
}