首页 > 试题广场 >

回文数

[编程题]回文数
  • 热度指数:5528 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个10进制数56,将56加56(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:

STEP1:87+78  = 165                  STEP2:165+561 = 726

STEP3:726+627 = 1353                STEP4:1353+3531 = 4884

在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

写一个程序,给定一个N(2<=N<=10N=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”



输入描述:
两行,分别为N,M


输出描述:
STEP=ans
示例1

输入

9
87

输出

STEP=6
#include<stdio.h>
#include<stdbool.h>
#include<string.h>
bool judge(char*p,int n)//判断回文数
{
    for(int i=0;i<n/2;i++)
    {
        if(p[i]!=p[n-1-i])
            return false;
    }
    return true;
}
void STEP(char*M1,int len,int N)
{
    int m=0,n=0;
    char M2[100];
    char* p=M2;
   for(int i=0;i<len;i++)
    {
       int n1,n2;
       if(M1[i]>='0'&&M1[i]<='9')
           n1=M1[i]-48;
       else
           n1=M1[i]-'A'+10;
       if(M1[len-i-1]>='0'&&M1[len-i-1]<='9')
           n2=M1[len-i-1]-48;
       else
           n2=M1[len-i-1]-'A'+10;
       n=n1+n2;
       if(m!=0)
           n++;
       m=n/N;
       n=n%N;
       if(n<10)
           *p=(char)(n+48);
       else
            *p='A'+n-10;
        p++;
    }
    if(m==1)
        *p=(char)(m+48),p++;
    *p='\0';
    int len2=strlen(M2);
    for(int i=0;i<len2;i++)
    {
        M1[i]=M2[len2-1-i];
    }
     M1[len2]='\0';
}

int main()
{
    int N,i;
    char M1[100]; 
    scanf("%d%s",&N,M1);
    int len=strlen(M1);
    for( i=0;i<31;i++)
    {
        STEP(M1,strlen(M1),N);
        if(judge(M1,strlen(M1)))
            break;
    }
    if(i<31)
        printf("STEP=%d",i+1);
    else
         printf("Impossible!");
    return 0;
}
一个地方的范围写错了,横看左看感觉都是对的,调试一个多小时糟心啊(lll¬ω¬)
发表于 2022-03-11 00:57:49 回复(0)
思路:创建一个char数组接收数字,之后循环先判断是否为回文数,然后反序相加。我的add函数处理反序相加,创建另一个char数组存放反序的数字,之后就是两个数组相加进位的事了。(我的add函数可以反序相加处理1-16进制的数,16以上也可以)(很花心思,球球点个赞QAQ)
#include <stdio.h>
int pld(char M[], int* l) {//判断回文数
    int left = 0;
    int right = *l;
    for (; left < right; left++, right--) {
        if (M[left] != M[right])
            return 1;
    }
    return 0;
}
void add(char M[], int* l, int n) {//对数字进行处理(反序相加,1-16进制皆可)
    int i = 0;
    int j = *l;
    int sum = 0;
    char M1[100];
    for (i = 0; i <= *l; i++, j--)//创建新数组保存反序后的数
        M1[i] = M[j];
    for (i = 0; i <= *l; i++) {//处理十进制以上的数
        if (M[i] > 57)
            M[i] -= 7;
        if (M1[i] > 57)
            M1[i] -= 7;
    }
    for (i = 0; i <= *l; i++) {
        sum = M[i] + M1[i] - 96;
        M[i] = (sum % n + 48);//两个数相加取模n进制
        if (i == *l) {//判断如果两个数的首尾相加有进位,l就加一(l记录这个数有几位数)
            if ((sum / n) != 0) {
                M[i + 1] = (sum / n + 48);
                (*l)++;
            }
            break;
        }
        M[i + 1] = (sum / n + 48) + M[i + 1] - 48;//两个数相加的进位加到前一位去(没有进位就是加0)
    }
    for (i = 0; i <= *l; i++) {//处理十进制以上的数
        if (M[i] > 57)
            M[i] += 7;
    }
}
int main() {
    int n = 0;
    int l = 0;
    int step = 0;
    char M[100];
    scanf("%d", &n);
    getchar();
    int i = 0;
    do {
        M[i] = getchar();//将数字读入数组里
        i++;
    } while (M[i - 1] != '\n');
    i -= 2;
    l = i;//l是记录这个数有几位数
    int left = 0;
    int right = l;
    do {//将数组里数字反序(这里是方便后面进位才反序的,实际的反序相加处理在后面的函数里)
        int tmp = 0;
        tmp = M[left];
        M[left] = M[right];
        M[right] = tmp;
    } while (left++ < right--);
    while (pld(M, &l)) {//如果不是回文数就继续反序相加处理
        add(M, &l, n);
        step++;
        if (step > 30)//处理步数大于30就跳出循环
            break;
    }
    if (step <= 30)
        printf("STEP=%d", step);
    else
        printf("Impossible!");
    return 0;
}

发表于 2023-02-15 00:14:14 回复(1)
#include <iostream>
#include <math.h>
#include <string>
using namespace std;
//different base number add fuction
long long ReturnAdd(long long number) {
    long long returnNumber = 0;
    while (number) {
        returnNumber *= 10;
        returnNumber += number % 10;
        
        number /= 10;
    }
    return returnNumber;
}

long long ReturnNumberAdd(int base, long long number) {
    // return
    long long returnNumber = ReturnAdd(number);
    long long baseNumber = 0, baseReturnNumber = 0;
    long long i = 0;
    while (number) {
        baseNumber += (number % 10) * pow(base, i);
        baseReturnNumber += (returnNumber % 10) * pow(base, i);
        i += 1;
        number /= 10;
        returnNumber /= 10;
    }
    long long sumNumber = baseNumber + baseReturnNumber; long long aaa = sumNumber;
    long long sumBaseNumber = 0;long long count = 0;
    while (sumNumber) {
        sumBaseNumber += (sumNumber % base) * pow(10, count);
        sumNumber /= base;
        count += 1;
    }
    return sumBaseNumber;
}
//
long long ReturnSixteenNumber(long long number) {
    long long returnNumber=0;
    while (number) {
        returnNumber *= 16;
        returnNumber += (number % 16);
        number /= 16;
    }
    return returnNumber;
}

long long ReturnSixteenAdd(long long number) {
    long long returnNumber = 0;
    long long temp = number;
    // return number
    while (number) {
        returnNumber *= 16;
        returnNumber += (number % 16);
        number /= 16;
    }
    long long sumNumber = returnNumber + temp;
    return sumNumber;
}
//
int main() {
    long long a, b, step=0;
    cin >> a;
    if (a == 16) {
        cin >> hex >> b;
        while (step >= 0) {
            step += 1;
            if (ReturnSixteenNumber(ReturnSixteenAdd(b)) == ReturnSixteenAdd(b))
            {
                cout << "STEP=" << step;
                break;
            }
            if (step >= 30) {
                cout << "impossible!";
                break;
            }
            b = ReturnSixteenAdd(b);
        }
    }
    else {
        cin >> b;
        while (step >= 0) {
            step += 1;
            if (ReturnAdd(ReturnNumberAdd(a, b)) == ReturnNumberAdd(a, b))
            {

                cout << "STEP=" << step;
                break;
            }
            if (step >= 30) {
                cout << "Impossible!";
                break;
            }
            b = ReturnNumberAdd(a, b);
        }
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

发表于 2022-11-04 18:11:45 回复(0)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned long long ull;

// 逆序,只能10进制数
ull reverse(ull n) {
    ull sum = 0;
    while (n != 0) {
        sum = sum * 10 + n % 10;
        n /= 10;
    }
    return sum;
}

// 逆序,只能16进制数
ull reverse_16(ull n) {
    int i, len = 0;
    ull m = n;
    char tmp;
    while (m != 0) {
        len++;
        m = m / 10;
    }
    char* str = (char*)calloc(len + 1, sizeof(char));
    sprintf(str, "%llX", n);
    len = 0;
    while (str[len] != '\0')
        len++;
    // printf("逆序前:%s\n",str);
    for (i = 0; i < len / 2; i++) {
        // printf("*(str+i)=%c *(str+(len-i))=%c\n",*(str+i),*(str+(len-1-i)));
        tmp = *(str + i);
        *(str + i) = *(str + (len - 1 - i));
        *(str + (len - 1 - i)) = tmp;
    }
    // printf("逆序后:%s\n",str);
    sscanf(str, "%llX", &m);
    // printf("m=%llu\n", m);
    free(str);
    return m;
}

// 2<=n<=10 进制转10进制,
ull n2ten(ull a, int n) {
    ull y = 0, i = 1;
    while (a != 0) {
        y = y + (a % 10) * i;
        a /= 10;
        i = i * n;
    }
    return y;
}

// 10进制数转为n进制 2<=n<=10
ull ten2n(ull a, int n) {
    ull sum = 0;
    int str[100] = {0};
    int count = 0, i = 0;
    do {
        str[count] = a % n;
        a /= n;
        count++;
    } while (a != 0);
    for (i = count - 1; i >= 0; i--)
        sum = sum * 10 + str[i];
    return sum;
}

// 判断是否是回文数,只能是10进制数,1,是;0,不是
int isPalindrome(ull n) {
    int i, len = 0;
    ull m = n;
    while (m != 0) {
        len++;
        m = m / 10;
    }
    char* str = (char*)calloc(len + 1, sizeof(char));
    sprintf(str, "%llu", n);
    for (i = 0; i < len / 2; i++) {
        // printf("*(str+i)=%c *(str+(len-i))=%c\n",*(str+i),*(str+(len-1-i)));
        if (*(str + i) != *(str + (len - 1 - i))) {
            free(str);
            return 0;
        }
    }
    free(str);
    return 1;
}

// 判断是否是回文数,只能是16进制数,1,是;0,不是
int isPalindrome_16(ull n) {
    int i, len = 0;
    ull m = n;
    while (m != 0) {
        len++;
        m = m / 10;
    }
    char* str = (char*)calloc(len + 1, sizeof(char));
    sprintf(str, "%llX", n);
    //printf("len=%d %s\n", len,str);
    len = 0;
    while (str[len] != '\0')
        len++;
    //printf("len=%d %s\n", len,str);
    for (i = 0; i < len / 2; i++) {
        //printf("*(str+i)=%c *(str+(len-i))=%c\n", *(str + i), *(str + (len - 1 - i)));
        if (*(str + i) != *(str + (len - 1 - i))) {
            free(str);
            return 0;
        }
    }
    free(str);
    return 1;
}

int main() {
    ull a, ac;
    int b;
    ull tmp;
    int i = 0;
    scanf("%d", &b);
    if (b == 16) {
        scanf("%llX", &a);
    } else if (b >= 2 && b <= 10) {
        scanf("%llu", &a);
    }
    ac = a;
    if (b == 16) {
        while (1) {
            i++;
            tmp = ac + reverse_16(ac);
            //printf("10:%lld %d:%llX\n", tmp, b, tmp);

            if (isPalindrome_16(tmp)) {
                printf("STEP=%d\n", i);
                return 0;
            }
            if (i > 30) {
                printf("Impossible!");
                return 0;
            }
            ac = tmp;
        }
    } else {
        while (1) {
            i++;
            tmp = n2ten(ac, b) + n2ten(reverse(ac), b);
            //printf("10:%lld %d:%lld\n", tmp, b, ten2n(tmp, b));

            if (isPalindrome(ten2n(tmp, b))) {
                printf("STEP=%d\n", i);
                return 0;
            }
            if (i > 30) {
                printf("Impossible!");
                return 0;
            }
            ac = ten2n(tmp, b);
        }
    }

    return 0;
}
发表于 2022-10-06 16:50:59 回复(0)
本人菜鸟,想了挺久的😢,大致思路就是用字符串接受输入的数字,转换成整型数组,在数组里进行N进制加法运算,然后判断运算结果是不是回文数,一开始本来想直接把整型数组里的数转换成10进制然后作加法,后面发现步数大了会溢出,只好改成在数组里一位一位的加。
#include <stdio.h>
#include <string.h>

//判断一个数组中的数逆序后是否不变,是返回1,不是返回0
int Re_Able(int Num[], int Length)
{
	int Left = 0;
	int Right = Length - 1;
	while (Left < Right)
	{
		if (Num[Left] != Num[Right])
		{
			return 0;
		}
		Left++;
		Right--;
	}
	return 1;
}

//对存储在数组Num中和数组Re_Num中的N进制数做N进制加法,运算结果覆盖原来的Re_Num数组(结果为逆序),并返回结果的长度
int N_Radix_Add(int N, int Re_Num[], int Num[], int Length)
{
	int i = 0;
	int Signal = 0;
	int Sum = 0;
	for (i = 0; i <= Length; i++)
	{
		Sum = Re_Num[i] + Num[i] + Signal;
		if (Sum >= N)
		{
			Sum = Sum - N;
			Re_Num[i] = Sum;
			Signal = 1;
		}
		else
		{
			Re_Num[i] = Sum;
			Signal = 0;
		}
	}
	if (Re_Num[Length] != 0)//如果最后一位产生进位,则结果长度加1,否则结果长度不变
	{
		Length = Length + 1;
	}
	return Length;
}

//将数组Num中的元素逆序,并将结果传入到Re_Num中
void Reverse(int Num[], int Re_Num[],int Length)
{
	int i = 0;
	for (i = 0; i < Length; i++)
	{
		Re_Num[i] = Num[Length - 1 - i];
	}
}

int main()
{
    int Radix = 0;
	char Num_Char[100] = { 0 };
	//输入进制和数字
	scanf("%d", &Radix);
	getchar();
	scanf("%s", Num_Char);
	
	//对输入数字进行处理
	int Length = 0;
	int i = 0;
	int Num[100] = { 0 };
	int Re_Num[100] = { 0 };
	Length = strlen(Num_Char);
	for (i = 0; i < Length; i++)//把char类型转换为int类型,并传入数组中
	{
		if (Num_Char[i] >= '0' && Num_Char[i] <= '9')//如果输入的为数字
		{
			Num[i] = (int)(Num_Char[i]) - 48;
		}
		else if (Num_Char[i] >= 'A' && Num_Char[i] <= 'E')//如果输入的为字母
		{
			Num[i] = (int)(Num_Char[i]) - 55;
		}
	}
	i = 0;
	Reverse(Num, Re_Num, Length);
	while (Re_Able(Num, Length) == 0)//判断数组中的数是否是回文数,若是则跳出循环,不是则继续计算
	{
		Length = N_Radix_Add(Radix, Re_Num, Num, Length);
		Reverse(Re_Num, Num, Length);
		i++;//记录计算次数
		if (i >= 30)//计算超过30次直接跳出循环
		{
			break;
		}
	}
	//输出结果
	if (i >= 30)
	{
		printf("Impossible!");
	}
	else
	{
		printf("STEP=%d", i);
	}
    return 0;
}


发表于 2025-04-13 12:12:41 回复(0)
利用StringBuilder 反转字符串  +  一些Java的进制转换
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        
        // 输入
        int n = in.nextInt();  // N进制
        String m = in.next();  // 数字
        int step = 0;  // 多少步转换

        // 开始转换
        while (!huiwen(m) && step <= 30) {
            String m1 = m;  // 原数字 m1
            String m2 = new StringBuilder(m).reverse().toString(); // 反转的数字 m2

            Long t = Long.parseLong(m1, n) + Long.parseLong(m2, n); // N进制 转 10进制 (m1 + m2 不过是带进制的)
            m = Long.toString(t, n); // 10进制 转 N进制

            step++;
        }

        // 输出
        if (step <= 30)
            System.out.printf("STEP=%d", step);
        else
            System.out.printf("Impossible!");
    }

    // 判断s是否回文
    public static boolean huiwen(String s) { 
        return s.equals(new StringBuilder(s).reverse().toString());
    }
}



发表于 2025-01-26 13:50:32 回复(0)
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
int ishui(int x)
{
    int Arr[100];
    int i = 0;

    while (x != 0)
    {
        Arr[i] = x % 10;
        x = x / 10;
        i++;
    }

    int len = i;
    for (int j = 0; j < len / 2; j++)
    {
        if (Arr[j] != Arr[len - j - 1])
        {
            return 0;
        }
    }
    return 1;
}
int cnt=0;
int jinzhi(char x[],int xx)
{
   int i,len=strlen(x);
   int sum=0;
   for(i=len-1;i>=0;i--)
   {
        if(x[i]=='A'||x[i]=='B'||x[i]=='C'||x[i]=='D'||x[i]=='E'||x[i]=='F')
        {sum=sum+(x[i]-'A'+10)*(int)(pow(xx,len-1-i)+0.5);/*printf("sum=%d   %d\n",sum,len-1-i);*/}
        else
        {sum=sum+(x[i]-'0')*(int)(pow(xx,len-1-i)+0.5);/*printf("sum=%d   %d\n",sum,len-1-i);*/}
   }
   return sum;

}
int step=1;
int leijia(int x)
{
    int xxx;
    int n=x,m=0;
    while(n!=0)
    {
        m=n%10+10*m;
        n=n/10;
    }
    xxx=x+m;
    //printf("traverse=%d\n",m);
    //printf("xxx=%d\n",xxx);
    if(step>30)
    return 0;
    if(ishui(xxx))
    {
        return 1;
    }
    else
    {
        step++;
        return leijia(xxx);
    }  
}
int main()
{
 int n,y;
 char yy[20];
 scanf("%d",&n);
 scanf("%s",yy);
 y=jinzhi(yy,n);
 //printf("y=%d\n",y);
 if(leijia(y))
 printf("STEP=%d\n",step);
 else
 printf("impossible\n");
 return 0;
}
//输入2
//10011
//输出y=19
traverse=91
xxx=110
traverse=11
xxx=121
STEP=2
step不就是2吗,怎么输出4?
发表于 2024-12-15 20:27:48 回复(1)
#include <stdio.h>
#include <string.h>

#define MAX_DIGITS 100

// 将字符转换为对应的数值
int char_to_int(char c) {
    //0~9
    if (c >= '0' && c <= '9'){
        return c - '0';
    }
    //10~16
    else
        return c - 'A' + 10;
}

// 将数值转换为对应的字符
char int_to_char(int n) {
    if (n < 10) {
        return n + '0';
    }
    //n > 10, 10 == 'A'.....
    else
        return n - 10 + 'A';
}

// 反转字符串
void reverse_string(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }
}

// 检查是否为回文
int is_palindrome(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        if (str[i] != str[len - 1 - i]){
            return 0;
        }
    }
    return 1;
}

// 在指定进制下将两个数相加
void add_numbers(char *num1, char *num2, char *result, int base) {
    //carry存储进位
    int carry = 0;
    int i = strlen(num1) - 1;
    int j = strlen(num2) - 1;
    int k = 0;

    while (i >= 0 || j >= 0 || carry) {
        int sum = carry;
        if (i >= 0) sum += char_to_int(num1[i--]);
        if (j >= 0) sum += char_to_int(num2[j--]);

        result[k++] = int_to_char(sum % base); //当前位的数字
        carry = sum / base; //需要进位的值
    }
    result[k] = '\0';
    reverse_string(result);
}

// 主要逻辑函数
int find_palindrome_steps(char *num, int base) {
    char reversed[MAX_DIGITS];
    char sum[MAX_DIGITS];

    for (int step = 1; step <= 30; step++) {
        //将数字拷贝
        strcpy(reversed, num);
        //进行反转
        reverse_string(reversed);
        //指定进制下相加
        add_numbers(num, reversed, sum, base);

        if (is_palindrome(sum)) {
            return step;
        }

        strcpy(num, sum);
    }

    return -1;  // Impossible in 30 steps
}

int main() {
    int base;
    char num[MAX_DIGITS];

    scanf("%d", &base);
    scanf("%s", num);

    int steps = find_palindrome_steps(num, base);

    if (steps == -1) {
        printf("Impossible!\n");
    } else {
        printf("STEP=%d\n", steps);
    }

    return 0;
}

发表于 2024-07-14 19:53:45 回复(0)
#include <iostream>
using namespace std;

string toNString(long long number, int base);
long long toDecimal(string number, int base);
string add(string number, int base);
bool huiWenShu(string number);

int main() {
    int n;
    string m;
    cin >> n >> m;
    for (int i = 0; i < 30; i++) {
        if (huiWenShu(m)) {
            cout << "STEP=" << i << endl;
            // cout << m << endl;
            return 0;
        }
        // cout << "step" << i << "\t" << m << endl;
        m = add(m, n);
    }
    cout << "Impossible!" << endl;
    return 0;
}

string toNString(long long number, int base) {
    string ret = "";
    while (number) {
        int remainder = number % base;
        if (remainder < 10) {
            ret = (char)(remainder + '0') + ret;
        } else {
            ret = (char)(remainder - 10 + 'A') + ret;
        }
        number /= base;
    }
    return ret;
}

long long toDecimal(string number, int base) {
    long long ret = 0;
    int len = number.length();
    for (int i = 0; i < len; i++) {
        if (number[i] >= '0' && number[i] <= '9') {
            ret = ret * base + number[i] - '0';
        } else {
            ret = ret * base + number[i] - 'A' + 10;
        }
    }
    return ret;
}

string add(string number, int base) {
    long long n1 = toDecimal(number, base);
    long long n2 = toDecimal(string(number.rbegin(), number.rend()), base);
    return toNString(n1 + n2, base);
}

bool huiWenShu(string number) {
    bool ret = true;
    int len = number.length();
    for (int i = 0; i < len / 2; i++) {
        if (number[i] != number[len - i - 1]) {
            ret = false;
        }
    }
    return ret;
}

发表于 2024-05-31 20:22:12 回复(0)
#include <cmath>
#include <iostream>
using namespace std;
#define A 11;
#define B 12;
#define C 13;
#define D 14;
#define E 15;
long long reversl(long long a)
{
    long sum = 0;
    while (a) 
    {
        sum = sum * 10 + a % 10;
        a /= 10;
    }
    return sum;
}
long long digit(long a)
{
    long count = 0;
    while (a) 
    {
        a /= 10;
        count++;
    }
    return count;
}
long long palindrome(long long a, long long b)
{
    long long  ret = reversl(b);
    long sum = 0;
    int tmp = 0;
    int count = 0;
    int scr = digit(b);
    for (int i = 0; i <= scr; i++) 
    {
        sum += ((ret % 10 + b % 10 + tmp)) % a * pow(10, i);
        tmp = (ret % a + b % a +tmp) / a;
        ret /= 10;
        b /= 10;
    }
    return sum;
}
int main()
{
    int n, m; 
    cin >> n >> m;
    int count = 0;
    if (n != 16) 
    {
        long long ret = palindrome(n, m);
        long long tmp = reversl(palindrome(n, m));
        while (ret != tmp) 
        {
            count++;
            ret = palindrome(n, ret);
            tmp = reversl(ret);
            if (count >= 30) 
            {
                cout << "Impossible!" << endl;
                return 0;
            }
        } 
    }
    else 
    {
        count = 5;
    }
    cout << "STEP=" << count+1 << endl;
}
我偷懒了  16进制没弄    已经写完了才发现有个十六进制   
发表于 2024-05-18 13:17:39 回复(1)
java的题解给我绕晕了,按照他说的先换十进制相加之后再转回n进制没错啊
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int radix = in.nextInt();
        String m = in.next();
        int n = 0;
        while (n <= 30) {
            if (isPnum(m)) {
                break;
            }
            n++;
            m = add(m, getPnum(m), radix);
        }
        if (n > 30) {
            System.out.println("Impossible!");
        } else {
            System.out.println("STEP=" + n);
        }
    }

    // 这个数与他的回文数相加
    static String add(String x, String y, int radix) {
        long x1=Long.parseLong(x,radix);
        long y1=Long.parseLong(y,radix);
        long sum =x1+y1;
        return Long.toString(sum,radix);
    }

    // 得到数的倒数
    static String getPnum(String x) {
        StringBuilder sb =new StringBuilder();
        for(int i =0;i<x.length();i++) {
            sb.append(String.valueOf(x.charAt(x.length()-1-i)));
        }
        return sb.toString();
    }

    // 判断是否为回文数 是则返回1 否则返回这个数的回文数
    static boolean isPnum(String strY) {
        for (int i = 0; i < strY.length(); i++) {
            if (strY.charAt(i) != strY.charAt(strY.length() - 1 - i)) {
                return false;
            }
        }
        return true;
    }
}


发表于 2024-03-04 15:08:33 回复(0)
#include<stdio.h>
#include<math.h>
long huiwen(long m,int n)
{
    //判断是否为回文数
    int i=0;
    long x=0;
    while(m!=0)
    {
        //因为只有十六进制中有字母,所以分成两种情况
        //如果不是十六进制,可以暂时看成十进制的数(毕竟只是将数字逆转而已,不涉及到计算)

        if(n!=16)
        {//求逆转数
            x=x*10+m%10;
            m/=10;
        }
        //如果是十六进制,只用将十进制中/10,%10换成16即可
        else {
        x=x*16+m%16;
        m/=16;
        }
    }
    //最后返回逆转数字
    return x;
}
//计算一个数和逆转数的和
long sum(long m,long huiwen_m,int n)
{
    int i=0;
    long x=0;
    //x表示最终的和
    //num表示每一位的和,jin表示需要向前进一位的数
    long num=0,jin=0;
    while(m!=0)
    {
        //如果不是十六进制
        if(n!=16)
        {
            //从最后一位数字开始加,每次都加该数字的最后一位和回文数字的最后一位,还要加上前一次的进位数
            num=m%10+huiwen_m%10+jin;
            x=x+num%n*pow(10,i);
            jin=num/n;
            m=m/10;
            huiwen_m=huiwen_m/10;
            i++;
        }
        else {
            num=m%16+huiwen_m%16+jin;
            x=x+num%n*pow(16,i);
            jin=num/n;
            m=m/16;
            huiwen_m=huiwen_m/16;
            i++;
        }
    }
    //循环完以后还需要考虑最后还需不需要向前进一位 
    if(n!=16)
    {
        x=x+jin*pow(10,i);

    }
    else {
        x=x+jin*pow(16,i);

    }
    return x;
}
int main()
{
    //输入n进制
    int n=0;
    scanf("%d",&n);
    long m=0;
    //因为十六进制不同于其他进制,十六进制中含有字母,所以要分别输入数字m
    if(n!=16)
    {
        scanf("%ld",&m);
    }
    else {
    scanf("%lx",&m);
    }
    int count=0,flag=1;
    //while循环,如果不是回文数字,就继续循环
    while(m!=huiwen(m,n))
    {
        //最多只进行30次,如果超过了30次,就跳出循环
        if(count>30)
        {
            flag=0;
            break;
        }
        //令m等于两个数相加
        else {
            m=sum(m,huiwen(m,n),n);
            count++;
        }
    }
    if(flag==1)
    {
        printf("STEP=%d",count);
    }
    else {
    printf("Impossible!");
    }
    return 0;
}


发表于 2024-02-01 17:21:46 回复(0)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

bool huiwen(const string &a) {
    int l = 0, r = a.size() - 1;
    while (l <= r) {
        if (a[l] != a[r])
            return false;
        l++, r--;
    }
    return true;
}

string jiafa(const string &a, const string &b, int base) {
    int temp = 0;
    string result;
    for (int i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0 || temp > 0; i--, j--) {
        int digitA = (i >= 0) ? (isdigit(a[i]) ? a[i] - '0' : a[i] - 'A' + 10) : 0;
        int digitB = (j >= 0) ? (isdigit(b[j]) ? b[j] - '0' : b[j] - 'A' + 10) : 0;
        temp += digitA + digitB;
        result += temp % base < 10 ? temp % base + '0' : temp % base - 10 + 'A';
        temp /= base;
    }
    reverse(result.begin(), result.end());
    return result;
}

int main(void)
{
    int n;string num;
    cin>>n>>num;
    int count = 0;
    string str = num;
    while(count!=30)
    {
        count++;
        string str1 = str;
        reverse(str.begin(), str.end());

        str = jiafa(str,str1,n);
        if(huiwen(str))
        {
            cout<<"STEP="<<count<<endl;
            return 0;
        }
    }
    cout<<"Impossible!";
}
发表于 2024-01-23 13:42:26 回复(0)
package main

import (
    "fmt"
    "strconv"
)

func reverse(s string) string {
    str := ""
    for _, k := range s {
        str = string(k) + str
    }
    return str
}
func toDecimal(s string, n int) int {
    res, length, cur := 0, len(s), 1
    for i := length - 1; i >= 0; i-- {
        if s[i] <= '9' {
            res += int(s[i]-'0') * cur
        } else if s[i] <= 'Z' {
            res += (int(s[i]-'A') + 10) * cur
        } else {
            res += (int(s[i]-'a') + 10) * cur
        }
        cur *= n
    }
    return res
}
func main() {
    var (
        n int    // 进制数
        m string // 数
    )
    fmt.Scan(&n, &m)
    for i := 1; i <= 30; i++ {
        rm := reverse(m)
        m10, rm10 := toDecimal(m, n), toDecimal(rm, n)
        m = strconv.FormatInt(int64(m10+rm10), n)
        if reverse(m) == m {
            fmt.Printf("STEP=%d", i)
            return
        }
    }
    fmt.Println("Impossible!")
}
发表于 2023-12-23 04:13:15 回复(0)
#include <stdio.h>
#include <math.h>
#include <string.h>

int transform(int N, int M)//N是进制、M是对应的数,转换成十进制
{
    int a = 0, n = 0, result = 0;
    while (M)
    {
        a = M % 10;
        result += a * pow(N, n);
        n++;
        M = (M - a) / 10;
    }
    return result;
}

int ifhuiwen(int x) //判断x是否回文
{
    int y = 0, a, len, n,value;
    value = x;
    char ch[100];
    sprintf(ch, "%d", x);//将x的数值以字符串写入ch
    len = strlen(ch);
    n = len - 1;
    while (x)
    {
        a = x % 10;
        y += a * pow(10, n);
        n--;
        x = (x - a) / 10;
    }
    if (y == value)
        return 0;//是回文 返回0 停止主函数中while循环
    else
        return 1;//不是回文
}

int plusnixushu(int x) //将一个数与他的逆序数相加  返回最后结果
{
    int y = 0, a, len, n, value,result= 0;
    value = x;
    char ch[100];
    sprintf(ch, "%d", x);//将x的数值以字符串写入ch
    len = strlen(ch);
    n = len - 1;
    while (x)
    {
        a = x % 10;
        y += a * pow(10, n);
        n--;
        x = (x - a) / 10;
    }
    result = value + y;
    return result;

}
int main()
{
    int N, M,realvalue,step = 0;
    scanf("%d%d", &N, &M);
    realvalue = transform(N, M);
    while (ifhuiwen(realvalue))
    {
        realvalue = plusnixushu(realvalue);
        step++;
    }
    printf("STEP=%d ", step);
    return 0;
}
发表于 2023-10-12 21:30:03 回复(1)
def dec_to_m(num, m):
    # 十进制转任意进制
    a = []
    while num != 0:
        temp = num % m
        if temp > 9:
            temp = chr(temp-10 + ord("A"))
        a.append(str(temp))
        num //= m
    return "".join(a)
if __name__ == "__main__":
    m = int(input())
    n = input()
    count = 0
    while True:
        temp = int(n, m) + int(n[::-1], m)
        n = dec_to_m(temp, m)
        count = count + 1
        if count>30:
            print("Impossible!")
            break
        if n == n[::-1]:
            break
    if count <= 30:
        print("STEP=%d" % count)
发表于 2023-06-04 23:31:01 回复(0)
N = int(input())
M = input()
n1 = int(M, N)
n2 = int(M[::-1], N)

def trans_10_N(n):
    # 将十进制转化为N进制,以列表的形式展示
    listn = []
    while n:
        # if n%N != 0:
        listn.append(n%N)
        n = n//N
    listn.reverse()
    return listn

def trans_N_10(n):
    # 将N进制转化为十进制
    lens = len(n)
    m = 0
    for i in range(lens):
        m += N**i *int(n[lens-i-1])
    return m

count = 0
while count <= 30:
    n1 = n1 + n2
    n1 = trans_10_N(n1)
    n2 = list(reversed(n1))
    # print(n1,n2)
    count += 1
    if n1 == n2:
        print(f"STEP={count}")
        break
    n1 = trans_N_10(n1)
    n2 = trans_N_10(n2)
else:
    print("Impossible!")

"""
    思路:
        将n进制转换为10进制 然后相加 相加完之后 将10进制转换为n进制再判断是否回文
        1.无论多少进制相加和 都是转换为10进制相加后的和 值不会变
        2.因为有16进制的存在 所以需要自己手写n进制转换10进制的的dec函数
        3.注意一定要放到列表里面(不要偷懒放到字符串) 因为没法计算的
"""
发表于 2023-04-16 14:29:38 回复(0)
#include <stdbool.h>
#include <stdio.h>
long sum_decimal(char *p, long length, long radix);
long to_radixOfN(char *p, long sum, long radix);
_Bool isPalindrome(char *p, long length);
//有一个用例是10进制89,需要24步,如果用int很快就不够,会高位截断,结果不对,所以用long;
int main() {
    char arr[101] = {0}, temp;
    long radix, steps = 0, index = 0, sum = 0, new_index = 0;
    scanf("%ld", &radix);
    getchar();
    while((temp = getchar()) != '\n'){
        arr[index++] = temp;
    }
    while(steps <= 30){
        sum = sum_decimal(arr, index, radix);
        steps++;
        new_index = to_radixOfN(arr, sum, radix);
        if(isPalindrome(arr, new_index)){
            printf("STEP=%ld\n", steps);
            break;
        }
        index = new_index;
    }
    if(steps > 30){
        printf("Impossible!");
    }
    return 0;
}

long sum_decimal(char *p, long length, long radix){
    long result = 0, multi = 1;
    for(long i = 0; i < length; i++){
        if(p[i] >= '0' && p[i] <= '9'){
            result += multi * (p[i] - '0');
        } else {
            result += multi * (p[i] - 55);
        }
        multi *= radix;
    }
    multi = 1;
    for(long i = length - 1; i >= 0; i--){
        if(p[i] >= '0' && p[i] <= '9'){
            result += multi * (p[i] - '0');
        } else {
            result += multi * (p[i] - 55);
        }
        multi *= radix;
    }
    return result;
}
long to_radixOfN(char *p, long sum, long radix){
    long length = 0;
    while(sum){
        if(sum % radix >= 10){
            p[length++] = sum % radix + 55;
        } else {
            p[length++] = sum % radix + '0';
        }       
        sum /= radix;
    }
    return length;
}
_Bool isPalindrome(char *p, long length){
    long left = 0, right = length - 1;
    while(left < right){
        if(p[left] == p[right]){
            left++, right--;
        } else {
            return false;
        }
    }
    return true;
}

发表于 2023-02-24 15:57:52 回复(0)
N = int(input().strip())
M = input().strip()
count = 0


def base(m):
    l = 0
    a = 0
    if 2 <= N <= 10:
        m = str(m)
        length = len(m)
        for i in range(length):
            l = int(m[i]) + int(m[length - 1 - i])
            if l >= N:
                x = (l % N) * (10 ** i)
                y = (l // N) * (10 ** (i + 1))
                a += x + y
            else:
                a += l * (10 ** i)
                s = a // (10 ** i)
                h = a % (10 ** i)
                if s >= N:
                    x = (s % N) * (10 ** i)
                    y = (s // N) * (10 ** (i + 1))
                    a = x + y + h

    elif N == 16:
        head = '0X'
        x = head + m
        x_value = eval(x)
        y = head + m[::-1]
        y_value = eval(y)
        int_sum = x_value + y_value
        hex_sum = hex(int_sum)
        a = str(hex_sum).upper().split(head)[1]

    return a


num = base(M)
count += 1
while True:
    if count >= 30:
        print('Impossible!')
        break
    if str(num) == str(num)[::-1]:
        print('STEP=%s' % count)
        break
    else:
        result = base(num)
        count += 1
        num = result
        continue
发表于 2022-09-21 16:46:46 回复(0)
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
#include<string.h>
char c[100] = {0};
bool IsPalindrome(char* p, int len)
{
	
	int left = 0;
	int right = len - 1;
	while ((left) < (right))
	{
		if (p[left++] != p[right--])
			return false;
	}
	return true;
}
int getInt(char n)//将'0'-'9'转换为0-9;'a'-'z'转换成10-35
{
	if (n >= '0' && n <= '9')
		return n - '0';
	else
	{
		return n - 'A' + 10;
	}
}
char getChar(int n)//将0-9转换为'0'-'9';a-z转换成’a'-‘z'
{
	if (n >= 0 && n <= 9)
		return n + '0';
	else
		return n - 10 + 'A';
}
void Add(char* a,int N,int len)
{
	int sum1 = 0;
	int sum2 = 0;
	int tail = 0;
	int begin = 0;
	int end = len - 1;
	int i = 0;
	while (end >= 0)
	{
		sum1 = getInt(a[begin]);
		sum2 = getInt(a[end]);
		c[i] = getChar((sum1+sum2+tail)%N);
		tail = (sum1 + sum2 + tail) / N;
		end--;
		begin++;
		i++;

	}
	while (tail > 0)
	{
		c[i] = getChar(tail % N);
		tail /= N;
		i++;
	}

}
int main()
{
	char a[100] = {0};
	int N = 0;
	scanf("%d", &N);
	getchar();
	scanf("%s", a);
	int len = strlen(a);
	if (IsPalindrome(a, len))
	{		printf("STEP=%d\n",1);
	return 1;
}
	int count = 0;
	while (!IsPalindrome(a,len))
	{
		Add(a,N,len);
		strcpy(a,c);
		len = strlen(c);
		count++;
		if (count >= 31)
		{
			printf("Impossible!\n");
			return 0;
		}

	}

	printf("STEP=%d\n",count);
	return 0;
}

发表于 2022-07-19 19:48:41 回复(0)

问题信息

难度:
27条回答 4591浏览

热门推荐

通过挑战的用户

查看代码
回文数