Ceceliaaa 2023-04-06 21:56 采纳率: 66.7%
浏览 18

关于 回文数的问题 求解

洛谷p1015,回文数的问题,大家能帮我看看问题出在哪里了吗

img


#include<stdio.h>
#include<ctype.h>
#include<string.h>
int ishuiwenshu(char*ch);
int main(void)
{//M[]即是我们读入的数组,第一次输入最大的位数是100,每次加法后最多往前进一位,最多30次,为了防止溢出,就把数组的大小放大了一点 
    char M[135];
    //M[]则用于存储每次加法后得到的新数字字符串 
    char subM[135];
    int N,i,k,n;
    
    scanf("%d",&N);
    scanf("%s",M);
    
    n=strlen(M);
    //输入的数字可能是16进制的,所以输入的可能会有字母,当遍历数组时,其ASCII码大于‘9’的时候,就是字母,为了方便,用tolower()都变成小写 
    for(i=0;i<n;i++)
    {
        if(M[i]>'9')
            {
                //处理输入的字母,转换成数字 
                M[i]=tolower(M[i]);
                M[i]=M[i]-'a'-'0';
            }
    }
    //开始3最多的0次判断与加法 
    for(k=0;k<=30;k++)
    { 
        //第一次进入该循环时,并不用subM[]数组来处理,但在加法过一次之后,为了要把上一次得到的subM[]的值赋给M[],然后再继续下面的加法 
        if(k>0)
        {   
            n=strlen(subM);
            for(i=0;i<n;i++)
            M[i]=subM[i];
        }
        //在每一次开始加法前,先判断是否是回文数,如果是,跳出循环,然后printf(); 
        if(ishuiwenshu(M))
        break;
        n=strlen(M);
        for(i=0;M[i]<n;i++)
        {    
            //用subM[]来存储得到的新数字字符串 
            subM[i]=M[i]+M[n-1-i];
            //处理进位问题 
            if(subM[i]>=N)
            {
                subM[i]=subM[i]%N;
                subM[i+1]=subM[i]/N;
            }
            
        }
    
    }
    //因为当k=31时,也会跳出循环,所以需要判断是否是要输出STEP 
    if(k>30)
    printf("Impossible!");
    else
    printf("STEP=%d",k);
    
}
//回文数判断的函数 
int ishuiwenshu(char*ch)
{
    int i,j;
    i=0;
    j=strlen(ch);
    for(i=0;i<j;i++)
    {
        if(ch[i]!=ch[j-1-i])
        return 0;
    }
    return 1;
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-07 11:19
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7482109
    • 这篇博客也不错, 你可以看下(c语言)从洛谷P1085不高兴的津津谈简化输入
    • 除此之外, 这篇博客: 洛谷P1015回文数中的 题目描述 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

      例如:给定一个十进制数56,将56加65(即把5656从右向左读),得到121是一个回文数。

      又如:对于十进制数8787:

      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)进制数MM(100位之内),求最少经过几步可以得到回文数。如果在3030步以内(包含30步)不可能得到回文数,则输出Impossible!


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已采纳回答 4月6日
  • 创建了问题 4月6日

悬赏问题

  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 matlab生成的x1图不趋于稳定,之后的图像是稳定的水平线
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求
  • ¥20 微信小程序 canvas 问题
  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验