NC16786. [NOIP1999]回文数
描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
输入描述
两行,分别是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!"; } }