Ceceliaaa 2023-04-08 08:35 采纳率: 66.7%
浏览 24
已结题

关于 回文数和进制的问题

为什么前几个测试点过不了吗大家,麻烦帮我看一下,语法方面是没有错误的应该

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(N=16&&M[i]>'9')
            {
                //处理输入的字母,转换成数字 
                M[i]=tolower(M[i]);
                M[i]=M[i]-'a'+10;
            }
    }
    //开始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/2);i++)
    {
        if(ch[i]!=ch[j-1-i])
        return 0;
    }
    return 1;
}

  • 写回答

2条回答 默认 最新

  • AI迅剑 2023-04-08 09:38
    关注
    
    #include <bits/stdc++.h> 
    using namespace std;
    int n, q[1000001], l, w[1000001], ans;
    string s;
    void init() 
    {
        int j = 0;
        for(int i = s.length() - 1; i >= 0 ; i--) 
        {
            if(s[i] >= '0' && s[i] <= '9') 
            {
                q[++j] = s[i] - '0';
            }
            else 
            {
                q[++j] = s[i] - 'A' + 10;
            } 
        }
    }
    void add(int a[], int b[]) 
    {
        for(int i = 1; i <= l; i++)
        {
            a[i] += b[i];
            a[i + 1] += a[i] / n; 
            a[i] %= n;
        }
        if(a[l + 1] > 0) 
        {
            l++; 
        }
    }
    bool f(int a[]) 
    {
        int ln = l;
        int i = 1;
        int j = l;
        while(ln--)
        {
            if(ln < l / 2) 
            {
                break;
            }
            if(a[i] != a[j])
            {
                return false; 
            }
            i++;
            j--;
        }
        return true;
    }
    void turn(int a[]) 
    {
        int j = 0;
        for(int i = l; i >= 1; i--) 
        {
            w[++j] = a[i]; 
        }
    }
    int main()
    {
        cin>>n>>s;
        init(); 
        l = s.length();
        while(!f(q)) 
        {
            turn(q);
            add(q, w); 
            ans++;
            if(ans > 30) 
            {
                break;
            }
        }
        if(ans > 30)
        {
            printf("Impossible!"); 
        }
        else
        {
            printf("STEP=%d", ans);
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?