C语言:判断一组数字是不是有序数组(一串相等的数也是有序)

写法一

#include<stdio.h>

void intputarr(int arr[],int n)

{

int i;

for(i=0;i<n;i++)

{

scanf("%d",&arr[i]);

}

}

int judge_arr(int arr[],int n)

{

int i;

int flag=0;

for(i=0;i<n-1;i++)

{

if(arr[i]==arr[i+1])

{

continue;

}

else if(arr[i]>arr[i+1])

{

flag=1;

}

else if(arr[i]<arr[i+1])

{

flag=-1;

}

}

if(flag==1)

{

for(i=0;i<n-1;i++)

{

if(arr[i]<arr[i+1])

return 0;

}

}

else if(flag==-1)

{

for(i=0;i<n-1;i++)

{

if(arr[i]>arr[i+1])

return 0;

}

}

return 1;

}

int main()

{

int n;

scanf("%d",&n);

int arr[20];

intputarr(arr,n);

int ret=judge_arr(arr,n);

if(ret==1)

{

printf("数组是有序数列\n");

}

else

{

printf("数组不是有序数列\n");

}

}

代码解析:在 judge_arr函数中进行判断,总体分为俩个步骤,首先确定该数组第一组相邻的两个数是 升序还是降序并作出标记(flag的赋值)升序flag=1;降序flag=-1; 在第一个循环结束flag都没 有被重新赋值说明这组数字都相等自然flag=0;第一个for循环要注意i<n-1否则会越界访问

if语句先判断是否相等,相等就continue跳过后面的判断;

然后在第二部分判断flag它是升序还是降序;如果升后面的所有都升序,有一组降序都结束循环 返 回0;反之同理返回1;循环结束没有返回;说明改组数字是有序或者相等的;

写法二

#include<stdio.h>

void intputarr(int arr[],int n)

{

int i;

for(i=0;i<n;i++)

{

scanf("%d",&arr[i]);

}

}

int main()

{

int n;

int i=0;

scanf("%d",&n);

int arr[20];

intputarr(arr,n);

int flag1=0;

int flag2=0;

for(i=0;i<n;i++)

{

if(i>0)

{

if(arr[i]>arr[i-1])

{

flag1=1;

}

else if(arr[i]<arr[i-1])

{

flag2=1;

}

}

}

if(flag1+flag2<=1)

{

printf("数组是有序数列\n");

}

else

{

printf("数组不是有序\n");

}

}

代码解析:设置升序标志flag1=0和降序标志flag2=0;第一个for循环中只有i>0时候才能比较两个相邻 的数;在for循环结束后如果一直是升序最后的flag1=1;flag2=0相加<=1; 反之同理;这里特 别说明相加<=1是因为在全部相等的情况下相加=0;为了最后的方便判断统称有序和相等 flag1+flag2<=1;如果结束循环后flag1+flag2=2说明相邻数字比较时有升有降;

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值