题解 | 回文数

回文数

https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
void reverse(int arr[], int vein_arr[], int n) {//交换数组位置,达到将一个数反过来
    int i = 0;
    for (i = 0; i < n; i++) {
        *(vein_arr + n - 1 - i) = *(arr + i);
    }
}
int judge(int arr[], int n) {//判断是否为回文数
    int right = n - 1;
    int left = 0;
    while (left <= right) {
        if (*(arr + right) != *(arr + left)) {
            return 0;
        }
        left++;
        right--;
    }
    return 1;
}
int cut(int arr[], long long M, int N) {//将十进制的数转换为N进制,每一位储存在数组中(从左到右权值越来越大)
    long long new_M;
    int j = 0;
    new_M = M;
    while (1) {
        if (new_M < N) {
            *(arr + j) = new_M;
            j++;
            break;
        }
        *(arr + j) = new_M % N;
        new_M = new_M / N;
        j++;
    }
    return j;// 返回的是数组中有几个数
}
long long ten_transform(int arr[], int n, int N) {//将数组元素乘以对应权值,得出换算后的十进制数
    long long ten_form = 0;
    int i = 0;
    for (i = 0; i < n; i++) {
        ten_form += *(arr + i) * pow(N, i);
    }
    return ten_form;
}

int main() {
    char ch;
    int flag = 0;
    int i = 0;
    int n = 0;
    int N = 0;
    long long M = 0;
    int arr[1024] = {0};
    int first_arr[1024] = {0};
    int vein_arr[1024] = {0};
    scanf("%d", &N);
    getchar();
    while((ch=getchar())!=EOF&&ch!='\n'){//处理字符串
        if(ch>='A'&&ch<='G'){
            first_arr[n] = ch - 55;
        }
        if(ch>='0'&&ch<='9'){
            first_arr[n] = ch - 48;
        }
        n++;
    }
    reverse(first_arr,arr,n);
    for (i = 1; i <= 30; i++) {
        reverse(arr,vein_arr,n);
        M = ten_transform(arr,n,N)+ten_transform(vein_arr,n,N);
        n = cut(arr,M,N);
        if(judge(arr,n)){
            printf("STEP=%d",i);
            flag = 1;
            break;
        }
    }
    if(0==flag){
        printf("Impossible!");
    }
    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务