You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用数组、map等函数仅用简单运算符判断数字序列的升降或无序状态

现有代码问题修正

你的原始代码存在几个会导致运行结果异常的问题:

  • 语法逻辑错误:C语言不支持a>b>c这类连续比较写法,该写法实际等效于(a>b) > c,会先判断a>b得到0/1的布尔值,再拿这个布尔值和c比较,完全不符合连续递增/递减的判断需求
  • 变量未初始化问题:unordered_flag、pattern变量未赋初始值,当输入序列长度小于3时会输出随机结果
  • 边界处理缺失:没有对重复值做兼容处理,也未覆盖全相等序列的判定场景
优化实现方案(仅用2个存储变量+简单运算符,无数组/额外函数)

核心逻辑用差值符号一致性校验实现,不需要存储3个数值,仅需记录上一个输入值和全局趋势符号即可:

  • 允许相等的递增:所有相邻数差值≥0,且至少存在一个差值>0
  • 允许相等的递减:所有相邻数差值≤0,且至少存在一个差值<0
  • 无序:序列中同时存在正差值和负差值
#include <stdio.h>
int main()
{
    int num, prev_val, curr_val, trend_sign = 0, is_unordered = 0;
    printf("请输入要比对的数字个数:");
    scanf("%d", &num);
    // 读取第一个数字作为初始基准值
    printf("输入第1个数字:");
    scanf("%d", &prev_val);
    
    for(int i = 2; i <= num; i++){
        printf("输入第%d个数字:", i);
        scanf("%d", &curr_val);
        int diff = curr_val - prev_val;
        int curr_sign = diff > 0 ? 1 : (diff < 0 ? -1 : 0);
        // 首次出现非相等差值时,记录全局趋势
        if(trend_sign == 0){
            trend_sign = curr_sign;
        }
        // 趋势冲突直接标记为无序
        else if(curr_sign != 0 && curr_sign != trend_sign){
            is_unordered = 1;
            // 若不需要继续输入后续数字可直接加break跳出循环,提升效率
        }
        prev_val = curr_val;
    }

    if(is_unordered){
        printf("\n序列状态:无序");
    }else if(trend_sign > 0){
        printf("\n序列状态:递增(含相等值)");
    }else if(trend_sign < 0){
        printf("\n序列状态:递减(含相等值)");
    }else{
        printf("\n序列状态:所有数值相等");
    }
    return 0;
}
无需3个变量的无序判定方法说明

该方案基于差值符号的一致性校验原理实现,仅用简单的减法、比较运算就能完成判定,不需要存储三个连续数值:
每次计算相邻两个数的差值符号,只要曾经记录过上升趋势(符号为1),后续出现下降段(符号为-1)就直接判定无序,反之同理,相等值(符号为0)不会改变全局趋势。
全程不需要借助数组、额外函数,仅需2个存储变量,比三变量比对的方案效率更高、边界兼容性更强。

内容的提问来源于stack exchange,提问作者ashrafhamil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:06:03