如何不使用数组、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
相关产品推荐
相关产品推荐

