全奇数字年份计算代码异常求助:非末尾零年份输出偏差
问题与修正方案
需求
输入一个年份(如2020),计算大于等于原年份的最小全奇数年(所有数字均为奇数:1、3、5、7、9)。
现有问题
当前Java代码仅能正确处理末尾两位为零的年份(如1900、1570),当输入年份末尾两位非零时,输出不符合预期:
| 输入年份 | 期望输出 | 实际输出 |
|---|---|---|
| 2020 | 3111 | 3131 |
| 1620 | 1711 | 1731 |
| 3461 | 3511 | 3571 |
当前代码
// 将年份末位转为奇数 if (year % 10 % 2 == 0) { year++; System.out.println("year after increment:" + year); } // 检查其余数位并累加对应量级 int temp = year / 10; int i = 10; while (temp > 0) { if (temp % i % 2 == 0) { year += i; } i *= 10; temp /= 10; } System.out.println("Year:" + year);
问题根源
- 处理高位偶数数位时,仅累加对应量级数值,但未将该数位后的所有低位重置为最小奇数(1),导致低位保留了原有的非最小奇数,最终结果偏大。
- 逻辑仅通过逐位累加调整,未考虑直接构造符合要求的数位结构,导致步骤冗余且结果错误。
修正方案
核心逻辑
将年份转为字符数组,从左到右遍历每一位:
- 遇到偶数数位:将该数位加1转为奇数,然后将其右侧所有数位设为最小奇数1,直接完成构造。
- 遇到奇数数位:直接跳过,继续检查下一位。
- 若原年份已是全奇数年,直接返回原年份。
修正后代码
public class NextOddDigitYear { public static void main(String[] args) { int inputYear = 2020; int result = findNextOddDigitYear(inputYear); System.out.println("符合要求的年份:" + result); } private static int findNextOddDigitYear(int year) { // 先检查原年份是否已经符合要求 if (isAllOddDigits(year)) { return year; } char[] digits = String.valueOf(year).toCharArray(); int length = digits.length; for (int i = 0; i < length; i++) { int currentDigit = digits[i] - '0'; if (currentDigit % 2 == 0) { // 当前位是偶数,加1转为奇数 currentDigit++; digits[i] = (char) (currentDigit + '0'); // 将右侧所有位设为最小奇数1 for (int j = i + 1; j < length; j++) { digits[j] = '1'; } // 构造完成,跳出循环 break; } } // 极端情况处理:如输入9998,处理后为9999;输入9999直接返回 int constructedYear = Integer.parseInt(new String(digits)); return isAllOddDigits(constructedYear) ? constructedYear : (int) Math.pow(10, length) + 1111 % (int) Math.pow(10, length); } // 判断年份所有数字是否均为奇数 private static boolean isAllOddDigits(int year) { if (year == 0) { return false; } while (year > 0) { int digit = year % 10; if (digit % 2 == 0) { return false; } year /= 10; } return true; } }
测试验证
- 输入2020 → 输出3111(符合期望)
- 输入1620 → 输出1711(符合期望)
- 输入3461 → 输出3511(符合期望)
- 输入1900 → 输出1911(符合正确输出)
内容的提问来源于stack exchange,提问作者Marie
相关产品推荐
相关产品推荐

