75分求助,有注释哦

P1015 [NOIP1999 普及组] 回文数

52wyd @ 2022-12-07 10:45:33

#include <stdio.h>
#include <string.h>

int k, bushu, len;
char str[10000], cp[10000];//cp储存原来的数的反转数

void change();//把这个数与它的反转数相加
int judge(); //判断是否是回文数

int main(void)
{
    scanf("%d%s", &k, str);//读入进制k和高精数str
    len = strlen(str);//计算高精数的位数

    if (judge())//开始即为回文数
    {
        printf("STEP=0");
        return 0;
    }

    for (bushu = 0; ; bushu ++)//bushu步数
    {
        if (bushu == 30)
        {
            printf("Impossible!");
            return 0;
        }
        change();   //改变高精数str
        if (judge())  //判断改变后的str是否为回文数
        {
            printf("STEP=%d", bushu + 1);   
            return 0;
        }
    }
}

void change()
{
    int i, j, m, si, s, c;

    for (i = len - 1, j = 0; i >= 0; i --, j ++)//cp储存原来的数的反转数      
        cp[j] = str[i]; 

    m = 0;
    for (i = 0; i <= len - 1; i ++)//高精加运算
    {
        if (str[i] <= '9')//把str、cp中的某一位用int类型储存
            s = str[i] - '0';
        else
            s = 10 + (str[i] - 'A');
        if (cp[i] <= '9')
            c = cp[i] - '0';
        else
            c = 10 + (cp[i] - 'A');
        m += s + c; //开始高精加计算
        si = m % k;
        if (si <= 10)
            str[i] = '0' + si;
        else
            str[i] = 'A' + (si - 10);
        m = (m - si) / k;   
    }

    if (m != 0)//判断是否需要进位
    {
        if (m <= 10)
            str[len] = '0' + m;
        else
            str[len] = 'A' + (m - 10);
        len ++;
    }
}

int judge()
{
    for (int i = 0, j = len - 1; i <= j; i ++, j --)
        if (str[i] != str[j])
            return 0;

    return 1;
}

by kdtlfx120813 @ 2022-12-07 12:30:01

哪题?


by ISTP @ 2022-12-07 12:40:01

@liufengxiang 旁边有啊,P1015


by 52wyd @ 2022-12-07 12:40:12

@liufengxiang P1015 [NOIP1999 普及组] 回文数


by ISTP @ 2022-12-07 16:36:11

@52wyd 我哭死,为了 A 掉这题把今天的下载样例次数都用光了......

先放份 AC 代码:

#include <bits/stdc++.h>
using namespace std;
int n, num[200], n1[200], n2[200];
string m;
void str2int();
bool check();
void turn();
int main(){
    int cnt = 0;
    cin>> n>> m;
    str2int();
    do{
        if(check()) break;
        turn();
    }while((++cnt)<30);
    if(cnt<30) cout<< "STEP="<< cnt;
    else cout<< "Impossible!";
    return 0;
}
void str2int(){
    num[0] = m.size();
    for(int i=1; i<=num[0]; i++)
        if(m[num[0]-i]>'9') num[i]=m[num[0]-i]-'A'+10;
        else num[i]=m[num[0]-i]-'0';
    return ;
}
bool check(){
    for(int i=1; i<=num[0]/2; i++)
        if(num[i] != num[num[0]-i+1]) return 0;
    return 1;
}
void turn(){
    memset(n1, 0, sizeof n1);
    memset(n2, 0, sizeof n2);
    for(int i=1;i<=num[0];i++)
        n1[i]=num[i], n2[i]=num[num[0]-i+1];
    int len = num[0]+1;
    memset(num, 0, sizeof num);
    num[0] = len;
    for(int i=1; i<=num[0]; i++)
        num[i+1] += (n1[i]+n2[i]+num[i])/n, num[i] = (n1[i]+n2[i]+num[i])%n;
    while(!num[num[0]]&&num[0]>1) num[0]--;
    return ;
}

可以先看看,我有空来调你的代码


by ISTP @ 2022-12-07 16:39:37

@52wyd 先说一句,你的那个 change 函数肯定能写得更优美更易懂一些


by 52wyd @ 2022-12-07 16:52:18

@QiMi 你的下载样例还有没,我的下载次数用完了::>_<::


by ISTP @ 2022-12-07 16:58:22

@52wyd 我有两个样例,1和2的。5应该是Impossible

2
10011

16
AC27

输出忘了,你拿我的代码对拍一下好了


by 52wyd @ 2022-12-07 22:30:45

问题已解决

change函数中进位的时候不小心把 if (si <= 9)写成 if (si <= 10)了


by 52wyd @ 2022-12-07 22:31:38

@QiMi 我的代码找到问题了 change函数中进位的时候不小心把 if (si <= 9)写成 if (si <= 10)了


by ISTP @ 2022-12-08 07:08:26

@52wyd az,lz 竟然调到那么晚

调出来了倒也可喜可贺,感觉没帮上忙 2333

(昨晚观猴去了)


|