给出一个序列,找出升序和降序的平均长度。
分情况进行讨论,需要注意的是等于情况的考虑,用到了bup,bdown来控制升序和降序的状态,mid用来表示等于的序列长度。
#include <stdio.h>
#include <string.h>
int number[100];
void slove(int num)
{
int samenum=0;
for(int i=1;i<num;i++)
{
if(number[i]==number[i+1])
samenum++;
}
if(samenum==num-1)
{
printf("Nr values = %d: 0.000000 0.000000\n",num);
return ;
}
int up=0,upnumber=0,down=0,downnumber=0,mid=0;
bool bup=false,bdown=false;
for(int i=1;i<num;i++)
{
if(bup&&number[i]>=number[i-1])//升序状态
upnumber++;
else if(bdown&&number[i]<=number[i-1])//降序状态
downnumber++;
else if(bup&&number[i]<number[i-1])//由升序转为降序
{
bup=false;
bdown=true;
down++;
downnumber++;
}
else if(bdown&&number[i]>number[i-1])//由降序转为升序
{
bup=true;
bdown=false;
up++;
upnumber++;
}
else if(!bup&&!bdown&&number[i]>number[i-1])//升序开始之前一直为等于序列
{
bup=true;
up++;
upnumber+=mid+1;
mid=0;
}
else if(!bup&&!bdown&&number[i]<number[i-1])//降序开始之前为等于序列
{
bdown=true;
down++;
downnumber+=mid+1;
mid=0;
}
else if(!bup&&!bdown&&number[i]==number[i-1])等于序列长度
mid++;
}
double dup,ddown;
if(up==0)
dup=0;
else
dup=upnumber*1.0/up;
if(down==0)
ddown=0;
else
ddown=downnumber*1.0/down;
printf("Nr values = %d: %.6lf %.6lf\n",num,dup,ddown);
}
int main()
{
//freopen("a.in","r",stdin);
int x;
while(scanf("%d",&x)!=EOF)
{
if(x==0)
break;
int num=0;
number[num++]=x;
scanf("%d",&x);
while(x)
{
number[num++]=x;
scanf("%d",&x);
}
if(x==0)
{
slove(num);
memset(number,0,sizeof(number));
continue;
}
}
return 0;
}