列表

详情


NC16786. [NOIP1999]回文数

描述

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

例如:给定一个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<=10或N=16)进制数M(100位之内),求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
进制N>10时,使用大写'A'字母表示10,'B'表示11,...,'E'表示16

输入描述

两行,分别是N,M。

输出描述

STEP=ans(ans表示答案)

示例1

输入:

9
87

输出:

STEP=6

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 48ms, 内存消耗: 11460K, 提交时间: 2019-08-04 13:17:22

import java.math.BigInteger;
import java.util.Scanner;

public class Main
{
	public static void main(String[]args)
	{
		Scanner cin=new Scanner(System.in);
		int n=cin.nextInt(),i;
		String m=cin.next();
		for(i=0;i<=30;i++)
		{
			String s=m;
			String ss=new StringBuilder(s).reverse().toString();
			if(s.compareTo(ss)==0)
			{
				System.out.println("STEP="+i);
				break;
			}
			BigInteger sum=new BigInteger(s,n).add(new BigInteger(ss,n));
			m=sum.toString(n);
		}
		if(i==30+1)
			System.out.println("Impossible!");
	}
}

Python3 解法, 执行用时: 41ms, 内存消耗: 4600K, 提交时间: 2022-02-10 18:47:06

n = int(input())
instr = input()
a = []
for ch in instr:
    try:
        a.append(int(ch,base=n))
    except Exception:
        pass

step = 0
while step <= 30:
    b = a[::-1]  # 倒置
    if a == b:
        break

    # add b and b.revert()
    a = []
    up = 0
    for index in range(len(b)):
        s = b[index] + b[-1 - index] + up
        a.append(s % n)
        up = 1 if s >= n else 0 
    if up == 1:
        a.append(1)
    step += 1

if step <= 30:
    print("STEP="+str(step))
else:
    print("Impossible!")

C++(clang++ 11.0.1) 解法, 执行用时: 2ms, 内存消耗: 396K, 提交时间: 2023-01-19 14:32:32

#include<bits/stdc++.h>
using namespace std;
long long n,a,b,c;
int ans;
string s;
int main()
{
	cin>>n>>s;
	a=0;
	for(int i=0;i<s.length();i++)
	{
		if(s[i]>='A')
		{
			a=a*n+s[i]-'A'+10;
		 } 
		 else
		 {
		 	a=a*n+s[i]-'0';
		 }
	}
	for(ans=0;ans<=30;ans++)
	{
		c=a;
		b=0;
		while(c>0)
		{
			b=b*n+c%n;
			c=c/n;
		}
		if(a==b) break;
		a=a+b;
	}
	if(a==b)
	{
		cout<<"STEP="<<ans;
	}
	else
	{
		cout<<"Impossible!";
	}
}

上一题