诗者才子酒中仙 2023-05-19 15:54 采纳率: 58.8%
浏览 23

C++ “回文数”结果报错

题目背景
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10或N=16)进制数M(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。
如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”

输入格式
两行,N与M
输入样例:

输出格式
如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)

输入输出样例
输入样例
9
87

输出样例
STEP=6

说明 提示
时间限制:1.0s 内存限制:256.0MB

我的代码

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int m;
int main()//比如:87+78 = 165 165+561 = 726 726+627 = 1353 1353+3531 = 4884
{
    int m;//n为数 
    char a[100];//a字符数组存储一个m进制的数字 
    cin>>m>>a;
    int i,j,k=strlen(a);
    int temp;
    int Flag=0;
    for(i=0;i<30;i++)//循环次数 
    {
        int flag=0;
        for(j=0;j<k/2;j++)
            if(a[j]!=a[k-j-1])
            {
                flag=1;//不是回文数 
                break;
            }
        if(!flag)//是回文数 
        {
            cout<<"STEP="<<i<<endl;
            Flag=1;//是否可以在30步内计算出来 
            break;
        }
        else//不是回文数 ,继续操作 
        {
            int aa[100],mm;
            
            //将a数组字符转化为int型数字,然后存储到数组aa中(这么做是为了方便后续加法计算)
            for(j=0;j<k;j++) 
            {
                if(a[j]>='0'&&a[j]<='9')
                mm=(int)(a[j]-'0');
                else
                mm=(int)(a[j]-'A'+10);
                aa[j]=mm;
            }
            int bb[100],sumsum[100]; //bb存储逆序的aa数组数据,sumsum存储aa数组与bb数组的和 
            
            int t=0;
            for(j=k-1;j>=0;j--)//将数组aa逆序存储在bb数组中 (其中t==k) 
                bb[t++]=aa[j];
                
            int r=0,kk=0;//kk为sumsum数组的长度 
            int temp;
            for(j=k-1;j>=0;j--)//加法计算(从最后一位逆序向前计算) 
            {
                temp=aa[j]+bb[j]+r;
                sumsum[kk++]=temp%m;
                r=temp/m;
            }
            while(r)
            {
                sumsum[kk++]=r%m;
                r/=m;
            }
            int lenSum=0;//lenSum==kk
            char sum[100];
            char ch;
            for(j=kk-1;j>=0;j--)//将sumsum数组数据转化为字符存储在sum中 
            {
                if(sumsum[j]>=0&&sumsum[j]<=9)
                    ch=(char)(sumsum[j]+'0');
                else 
                    ch=(char)('A'+sumsum[j]-10);
                sum[lenSum++]=ch;
            }
            k=0;
            for(j=0;j<kk;j++)//将数组sum内容拷贝给数组a 
                a[k++]=sum[j];
        }
    } 
    if(!Flag)
    cout<<"Impossible!"<<endl;
    return 0;
}

我的题目显示有问题,可不知道出在哪?请将正确完整代码附上,必采纳!

  • 写回答

2条回答 默认 最新

  • qq_53090785 2023-05-19 16:54
    关注

    目前我看到第51行到63行有问题,其他地方没仔细看
    两个数相加,应该根据当前进制转化为10进制相加,比如2进制数 110翻转为011,相加为5加3=8;
    之后加得到的数转换为当前进制格式,8转为2进制为1000;
    进制转换网上可以查

    评论

报告相同问题?

问题事件

  • 创建了问题 5月19日

悬赏问题

  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 后缀 crn 游戏文件提取资源
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开