如何用C语言实现奇偶交替递归检测函数及数字升序判断?
C语言实现正整数的数字逆序升序+奇偶交替判断
以下是满足需求的完整代码,包含三个指定函数,重点实现递归版的奇偶交替判断:
#include <stdio.h> #include <stdbool.h> // 确保输入为正整数 int getNumber() { int num; do { printf("请输入一个正整数: "); // 校验输入是否为合法正整数 } while (scanf("%d", &num) != 1 || num <= 0); return num; } // 判断数字从右到左是否升序 bool isAscendingOrder(int n) { // 单个数字直接满足条件 if (n < 10) { return true; } while (n >= 10) { // 取最后两位数字 int last = n % 10; int secondLast = (n / 10) % 10; // 从右到左升序要求倒数第二位 < 最后一位(如9876的6<7<8<9) if (secondLast >= last) { return false; } // 去掉最后一位,继续判断剩余部分 n /= 10; } return true; } // 递归判断数字是否奇偶交替 bool isAlternateNumber(int n) { // 递归终止条件:单个数字无相邻位,直接返回真 if (n < 10) { return true; } // 获取最后两位数字 int last_digit = n % 10; int prev_digit = (n / 10) % 10; // 判断当前最后两位奇偶性是否不同 if ((last_digit % 2) == (prev_digit % 2)) { return false; } // 递归处理去掉最后一位后的数字,验证剩余部分的交替性 return isAlternateNumber(n / 10); } int main() { int num = getNumber(); bool isAsc = isAscendingOrder(num); bool isAlt = isAlternateNumber(num); if (isAsc && isAlt) { printf("%d 满足从右到左升序且奇偶交替的条件\n", num); } else { printf("%d 不满足条件\n", num); if (!isAsc) { printf("原因:数字从右到左不是升序\n"); } if (!isAlt) { printf("原因:数字奇偶未交替\n"); } } return 0; }
函数细节说明
getNumber函数
通过循环强制校验输入:
- 用
scanf返回值判断输入是否为整数类型 - 同时检查数值是否大于0,不满足则重新提示输入
isAscendingOrder函数
核心逻辑是从右到左逐位比对:
- 每次取当前数字的最后两位,判断倒数第二位是否小于最后一位
- 只要有一对不满足就直接返回false,循环到只剩一位时返回true
isAlternateNumber递归函数
递归核心是逐步缩小问题规模:
- 终止条件:数字小于10(仅一位)时,无相邻位需要比较,返回true
- 当前层判断:取最后两位,检查奇偶性是否不同(一奇一偶)
- 递归调用:若当前两位满足交替,去掉最后一位(数字除以10),递归验证剩余部分
举个验证示例:数字9876
- 第一次调用:检查6和7(奇偶不同),递归处理987
- 第二次调用:检查7和8(奇偶不同),递归处理98
- 第三次调用:检查8和9(奇偶不同),递归处理9
- 第四次调用:9<10,返回true,逐层回溯最终返回true
内容的提问来源于stack exchange,提问作者Yuval Yanay
相关产品推荐
相关产品推荐

