0分求助,大佬们帮我看看

P1015 [NOIP1999 普及组] 回文数

aa9527 @ 2022-07-12 16:34:29

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int fun1(int num[])         //判断位数 
{
    for(int i=99;i>=0;i--)
    {
        if(num[i]!=0)
            return i+1;
    }
}
void fun2(int num[],int *num_)  //数组元素顺序颠倒 
{
    for(int i=0;i<fun1(num);i++)
    {
        num_[i]=num[fun1(num)-i-1]; 
    }   
}
bool fun3(int num[])        //判断回文 
{
    for(int i=0;i<fun1(num)/2;i++)
    {
        if(num[i]!=num[fun1(num)-i-1])
            return false;
    }
    return true;
}
int main()
{
    int N=0;
    char str[101]={0};
    cin>>N;
    cin.getline(str,101);
    cin.getline(str,101);
    int num[101]={0};
    for(int i=strlen(str)-1;i>=0;i--)//字符串换成整型数组,逆向存储,即num[0]存最低位 
    {
        if(str[i]>='0' && str[i]<='9')
            num[i]=str[i]-'0';
        else
            num[i]=str[i]-'A'+10;
    }
    for(int i=1;i<=30;i++)
    {
        int num_[101]={0};
        fun2(num,num_);         //数组元素顺序颠倒 
        for(int i=0;i<fun1(num);i++)    //数组相加 
        {
            num[i]=num[i]+num_[i];
            if(num[i]>=N)
            {
                num[i+1]++;
                num[i]=num[i]%N;
            }
        }
        if(fun3(num)==1)        //判断回文 
        {
            cout<<"STEP="<<i;
            return 0;
        }
    }
    cout<<"Impossible!";
    return 0;
}

by Dreamer_002 @ 2022-07-20 15:32:43

有BUG:

1.16进制的判断没有写小写情况(因为题目中没有给出大小写)。

2.没有输出"STEP=0"。

3.main函数里多次定义了num数组。


by Dreamer_002 @ 2022-07-20 15:40:57

AC代码:

#include<cstdio>
#include<cstring>
const int N = 1005;

int c[N];
int b[N];
int a[N];
int step;
int n;
char k[N];
int ok;

int main()
{
    scanf("%d%s",&n,k);

    for(int i=1;i<=strlen(k);i++)
    {
        if((k[i-1]>='a' && k[i-1]<='z'))
        {
            a[0]++;
            a[strlen(k)-i+1]=k[i-1]-'a'+10;
        }
        else if((k[i-1]>='A' && k[i-1]<='Z'))
        {
            a[0]++;
            a[strlen(k)-i+1]=k[i-1]-'A'+10;
        }
        else
        {
            a[0]++;
            a[strlen(k)-i+1]=k[i-1]-'0';
        }
    }

    ok=1;

    for(int i=1;i<=a[0]/2;i++)
    {
        if(a[i]!=a[a[0]-i+1])
        {
            ok=0;
            break;
        }
    }

    if(ok==1)
    {
        printf("STEP=0\n");
        return 0;
    }

    while(step<=30)
    {
        step++;

        memset(b,0,sizeof(b));

        for(int i=1;i<=a[0];i++)
        {
            b[0]++;
            b[i]=a[a[0]-i+1];
        }

        memset(c,0,sizeof(c));

        c[0]=a[0];

        for(int i=1;i<=a[0];i++)
        {
            c[i]+=a[i]+b[i];
            c[i+1]=c[i]/n;
            c[i]=c[i]%n;
        }

        if(c[c[0]+1]!=0)
        {
            c[0]++;
        }

        ok=1;

        for(int i=1;i<=c[0]/2;i++)
        {
            if(c[i]!=c[c[0]-i+1])
            {
                ok=0;
                break;
            }
        }

        if(ok==1)
        {
            break;
        }

        for(int i=1;i<=c[0];i++)
        {
            a[i]=c[i];
        }
        a[0]=c[0];
    }

    if(step>30)
    {
        printf("Impossible!\n");
    }
    else
    {
        printf("STEP=%d\n",step);
    }

    return 0;
}

|