Ceceliaaa 2023-04-08 16:08 采纳率: 90.9%
浏览 26
已结题

关于 回文数 和进制数 的问题

我不懂了啊大家,这代码怎么越改越怪呢

img


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],ssubM[135];
    int N,i,j,k,n;
    
    scanf("%d",&N);
    scanf("%s",M);
    
    n=strlen(M);
    //输入的数字可能是16进制的,所以输入的可能会有字母,当遍历数组时,其ASCII码大于‘9’的时候,就是字母,为了方便,用tolower()都变成小写 
    if(ishuiwenshu(M))
      printf("STEP=0");
    if(!ishuiwenshu(M))
    {
        for(i=0;i<n;i++)
    {
        if(N==16&&M[i]>'9')
            {
                //处理输入的字母,转换成数字 
                M[i]=tolower(M[i]);
                M[i]=M[i]-'a'+10;
            }
    }
    //开始3最多的0次判断与加法 
    for(k=1;k<=30;k++)
    { 
        //第一次进入该循环时,并不用subM[]数组来处理,但在加法过一次之后,为了要把上一次得到的subM[]的值赋给M[],然后再继续下面的加法 
        if(k>1)
        {   
            n=strlen(subM);
            for(i=0;i<n;i++)
            {
                M[i]=ssubM[i];
                ssubM[i]=0;
                subM[i]=0;//将subM[]同时初始化为0,防止上一次的数值产生误差 
            }
        } 
        
        for(i=0;i<n;i++)
        {    
            //用subM[]来存储得到的新数字字符串 
            subM[i]=M[i]+M[n-1-i];
            ssubM[n-1-i]=subM[i];
        }
        for(j==0;j<n;j++)
        {
            //处理进位问题 
            if(ssubM[j]>=N)
            {    //需要逆位存储,不然反过来会类似于从十位开始往前近 
                ssubM[j]=subM[j]%N;
                ssubM[j]=subM[j]/N;
                
            }
        }
        n=strlen(ssubM);
        for(i=0;i<n;i++)
        {    
            //用subM[]来存储得到的新数字字符串 
            subM[n-1-i]=ssubM[i];
        }
            //在每一次开始加法后,先判断是否是回文数,如果是,跳出循环,然后printf();
            if(ishuiwenshu(subM))
            break;
    
    }
    //因为当k=31时,也会跳出循环,所以需要判断是否是要输出STEP 
    if(k>30)
    printf("Impossible!");
    else
    printf("STEP=%d",k);
    }
    
    return 0;
    
}
//回文数判断的函数 
int ishuiwenshu(char*ch)
{
    int i,j;
    i=0;
    j=strlen(ch);
    for(i=0;i<=(j/2);i++)
    {
        if(ch[i]!=ch[j-1-i])
        return 0;
    }
    return 1;
}

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2023-04-08 18:21
    关注

    以下内容部分参考ChatGPT模型:


    这段代码的问题在于有一处赋值语句写成了判等式,导致程序逻辑出现了问题。具体来说,在第27行,判断输入数字是否为16进制时,应该用双等号判等,而不是单等号。因为单等号会把N赋值为16,导致程序不能正确处理16进制数字中的字母。

    正确的代码如下:

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    int ishuiwenshu(char* ch);
    
    int main(void)
    {
        char M[135];
        char subM[135];
        int N, i, k, n;
    
        scanf("%d", &N);
        scanf("%s", M);
    
        n = strlen(M);
    
        for (i = 0; i < n; i++) {
            if (N == 16 && M[i] > '9') {
                M[i] = tolower(M[i]);
                M[i] = M[i] - 'a' + 10;
            }
        }
    
        for (k = 0; k <= 30; k++) {
            if (k > 0) {
                n = strlen(subM);
                for (i = 0; i < n; i++) {
                    M[i] = subM[i];
                    subM[i] = 0;
                }
            }
    
            if (ishuiwenshu(M)) {
                break;
            }
    
            n = strlen(M);
            for (i = 0; i < n; i++) {
                subM[i] = M[i] + M[n - 1 - i];
                if (subM[i] >= N) {
                    subM[i] = subM[i] % N;
                    subM[i + 1] = subM[i] / N;
                }
            }
        }
    
        if (k > 30) {
            printf("Impossible!");
        } else {
            printf("STEP=%d", k);
        }
    
        return 0;
    }
    
    int ishuiwenshu(char* ch)
    {
        int i, j;
        i = 0;
        j = strlen(ch);
        for (i = 0; i <= (j / 2); i++) {
            if (ch[i] != ch[j - 1 - i]) {
                return 0;
            }
        }
        return 1;
    }
    

    注意,在修改了代码之后,还需要测试代码是否能够正确运行,以确保修改的正确性。


    如果我的建议对您有帮助、请点击采纳、祝您生活愉快

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 已采纳回答 12月14日
  • 修改了问题 4月8日
  • 修改了问题 4月8日
  • 展开全部