一只刷题的北京烤鸭 2024-08-28 20:50 采纳率: 55.6%
浏览 3

回文数列c++,我不知道哪里错了,有人指导一下吗?


#include<bits/stdc++.h>
using namespace std;
char s[110];
int a[100001];
int b[100001];
int c[100001];
int p,v,sum;
int main(){
    scanf("%s",s+1);
    int len=strlen(s+1);
    for(int i=1;i<=len;i++){
        a[i]=s[len-i+1]-'0';
    }
    bool flag;
    for(int i=1;i<=30;i++){
        p=0;
        for(int j=len;j>=1;j--){
            p++;
            a[p]=b[j];
        }
        for(int j=1;j<=len;j++){
            if(a[j]==b[j]){
                flag=true;
            }
            else{
                flag=false;
                break;
            }
        }
        if(flag){
            printf("%d\n",i);
            break;
        }
        v=0;
        for(int j=1;j<=len;j++){
            a[j]+=b[j]+v;
            v=a[j]/10;
            a[j]%=10;
            if(v>=1&&j==len){
                a[len+1]=v;
                len++;
                break;
            }
        }
    }
    if(!flag){
        printf("Impossible!");
    }
    return 0;
}

img

img


有人知道我哪里错了吗?
我完全没有看出来
希望有人解答

  • 写回答

2条回答 默认 最新

  • 清水白石008 2024-08-28 21:16
    关注
    🕒下午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“最伟大的荣耀不在于从不跌倒,而在于每次跌倒后都能站起来。” — 纳尔逊·曼德拉
    

    在你提供的代码中,存在一些逻辑和实现上的问题,导致无法正确计算出回文数。以下是对代码的分析和修正建议:

    代码问题分析

    1. 输入处理

      • 你使用 scanf 读取字符串,但没有处理进制的转换。需要将输入的字符串转换为对应进制的整数。
    2. 反转和加法逻辑

      • 反转数字的逻辑不够清晰,尤其是在处理进制时。你需要确保在加法时考虑到进制的限制。
    3. 回文检查

      • 回文检查的逻辑需要在每一步加法后进行,而不是在循环的开始。
    4. 步数限制

      • 需要在每一步中检查是否达到了回文数,并在超过 30 步时输出 "Impossible!"。

    修正后的代码

    以下是修正后的代码,考虑了上述问题:

    #include <bits/stdc++.h>
    using namespace std;
    
    char s[110];
    int a[100]; // 存储当前数的数组
    int b[100]; // 存储反转后的数的数组
    int base; // 进制
    int steps; // 步数
    
    // 检查是否是回文数
    bool isPalindrome(int len) {
        for (int i = 0; i < len / 2; i++) {
            if (a[i] != a[len - 1 - i]) {
                return false;
            }
        }
        return true;
    }
    
    // 反转数组
    void reverseArray(int len) {
        for (int i = 0; i < len; i++) {
            b[i] = a[len - 1 - i];
        }
    }
    
    // 进制加法
    int add(int len) {
        int carry = 0;
        for (int i = 0; i < len; i++) {
            a[i] += b[i] + carry;
            if (a[i] >= base) {
                a[i] -= base;
                carry = 1;
            } else {
                carry = 0;
            }
        }
        if (carry > 0) {
            a[len] = carry; // 处理进位
            return len + 1; // 返回新长度
        }
        return len; // 返回原长度
    }
    
    int main() {
        scanf("%s %d", s, &base);
        int len = strlen(s);
        
        // 将输入的字符串转换为对应进制的整数
        for (int i = 0; i < len; i++) {
            a[i] = s[len - 1 - i] - '0'; // 反转存储
        }
    
        for (steps = 0; steps < 30; steps++) {
            if (isPalindrome(len)) {
                printf("%d\n", steps);
                return 0;
            }
            reverseArray(len);
            len = add(len);
        }
    
        printf("Impossible!\n");
        return 0;
    }
    

    代码说明

    1. 输入处理

      • 读取字符串和进制。
    2. 回文检查

      • isPalindrome 函数检查当前数组是否为回文。
    3. 反转数组

      • reverseArray 函数将当前数组反转到另一个数组。
    4. 进制加法

      • add 函数执行进制加法,并处理进位。
    5. 主逻辑

      • 在主循环中,检查是否为回文,如果是则输出步数;否则进行加法和反转,直到达到 30 步。

    总结

    通过以上修正,代码应该能够正确地计算出最少步数以得到回文数,或者在超过 30 步时输出 "Impossible!"。如果你还有其他问题或需要进一步的帮助,请随时询问!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月28日

悬赏问题

  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错