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

全奇数字年份计算代码异常求助:非末尾零年份输出偏差

问题与修正方案

需求

输入一个年份(如2020),计算大于等于原年份的最小全奇数年(所有数字均为奇数:1、3、5、7、9)。

现有问题

当前Java代码仅能正确处理末尾两位为零的年份(如1900、1570),当输入年份末尾两位非零时,输出不符合预期:

输入年份期望输出实际输出
202031113131
162017111731
346135113571

当前代码

// 将年份末位转为奇数
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),导致低位保留了原有的非最小奇数,最终结果偏大。
  2. 逻辑仅通过逐位累加调整,未考虑直接构造符合要求的数位结构,导致步骤冗余且结果错误。

修正方案

核心逻辑

将年份转为字符数组,从左到右遍历每一位:

  • 遇到偶数数位:将该数位加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:35:22