【蓝桥杯】生成回文数

标题:生成回文数

所谓回文数就是左右对称的数字,比如:
585,5885,123321…
当然,单个的数字也可以算作是对称的。

小明发现了一种生成回文数的方法:
比如,取数字19,把它与自己的翻转数相加:
19 + 91 = 110,如果不是回文数,就再进行这个过程:
110 + 011 = 121 这次是回文数了。

200以内的数字中,绝大多数都可以在30步以内变成回文数,只有一个数字很特殊,就算迭代了1000次,它还是顽固地拒绝回文!

请你提交该顽固数字,不要填写任何多余的内容。


public class C_Main {
    private static int sum;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for (int i = 100; i < 200; i++) {

            sql(i);
            if (sum > 200) {
                System.out.println("大于" + sum + "的");
            }
        }

    }

    private static void sql(int i) {
        // TODO Auto-generated method stub
        if (!is(i)) {
            sum++;
            int num = i + dudu(i);
            sql(num);

        } else {
            System.out.print("回文数"+i);
            System.out.println("   "+sum);
            sum = 0;
        }
    }

    private static boolean is(int originalNumber) {

        int palindrome = 0;
        int origin = originalNumber;

        // get the palindrome
        while (originalNumber != 0) {
            palindrome = palindrome * 10 + originalNumber % 10;
            originalNumber /= 10;
        }

        return palindrome == origin;
    }

    private static int dudu(int i) {
        int p = 0;
        while (i != 0) {
            p = p * 10 + i % 10;
            i /= 10;
        }
        return p;

    }

}

从最后结果就能看出来,只有196需要迭代好多好多次!

<think>好的,用户的问题是关于蓝桥杯单片机比赛中使用printf函数输出中文时出现乱码的解决方案。我需要先理解这个问题的可能原因,然后给出对应的解决方法。 首先,用户提到使用sprintf时数码管的显示问题,但当前问题转向了printf输出中文乱码。可能的原因有几个:编码格式不匹配、单片机本身的字符集支持有限、或者库函数的限制。 蓝桥杯单片机通常使用特定的开发环境,比如Keil或者IAR,这些环境的默认编码可能是GB2312或者GBK,而用户的代码文件可能保存为UTF-8或其他编码格式,导致编译器处理中文字符时出错。这时候需要检查编辑器的编码设置,确保代码文件保存为GB2312或GBK。 另外,单片机的标准库可能不支持中文字符的输出。printf函数在单片机中通常用于串口输出,如果库函数没有正确配置中文字符集,会导致乱码。此时需要确认使用的库是否支持中文,或者是否需要自定义输出函数来处理中文。 还有可能,用户在代码中直接使用中文字符串,但编译器没有正确识别这些字符。例如,在Keil中,如果代码文件的编码与编译器设置不一致,就会出现乱码。用户需要将代码文件的编码更改为编译器支持的格式,或者在代码中使用转码后的字符数组。 此外,硬件连接也可能影响输出,比如串口波特率设置不正确,导致数据传输错误。虽然用户的问题更可能是编码问题,但检查波特率等设置也是必要的步骤。 接下来,根据这些可能的原因,我需要分步骤给出解决方案。首先调整编码格式,然后检查库函数支持情况,最后考虑自定义输出或转码处理。同时,引用用户提供的参考内容,其中提到数码管显示的问题,可能与字符串处理有关,但这里需要关注的是中文字符的输出处理。 可能还需要建议用户使用ASCII字符代替中文,或者通过其他方式显示中文,比如点阵屏或自定义字库。但蓝桥杯比赛中可能更推荐使用英文字符避免乱码问题,或者按照参考中的方法处理字符串格式,确保缓冲区足够大,避免溢出导致的显示异常。 最后,生成相关问题,帮助用户深入理解可能遇到的类似问题,比如编码设置的影响、库函数的使用限制、以及硬件配置对输出的影响等。</think>### 蓝桥杯单片机 printf 中文乱码解决方案 #### 1. **编码格式问题** 蓝桥杯单片机开发环境(如Keil)默认使用**GB2312/GBK编码**,若代码文件保存为UTF-8或其他编码,会导致中文字符解析错误。 **解决方法**: - 在代码编辑器中(如Keil),将文件编码设置为**GB2312**或**GBK**,重新输入中文字符并编译[^1]。 - 若使用外部编辑器(如VSCode),保存文件时选择编码格式为`GB2312`。 #### 2. **标准库函数限制** 单片机标准库的`printf`函数可能未适配中文字符集,导致串口输出乱码。 **解决方法**: - **自定义串口输出函数**:绕过标准库,直接通过串口发送字节流。例如: ```c void UART_SendString(char *str) { while (*str) { SBUF = *str++; while (!TI); TI = 0; } } ``` 调用时使用`UART_SendString("中文内容")`。 #### 3. **硬件配置问题** 串口通信参数(如波特率、校验位)不匹配可能导致数据传输错误。 **解决方法**: - 检查单片机与上位机的**波特率**是否一致(如9600、115200)。 - 确认串口初始化代码中数据位、停止位配置正确。 #### 4. **替代方案** 若无法解决编码问题,可改用**ASCII字符或数字**替代中文,或通过**数码管/LCD屏显示编码后的内容**。例如,参考数码管段码处理方式,确保字符串缓冲区足够大以避免溢出。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值