NOIP 1999 回文数(优解)

题目描述
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把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.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。
输入
给定一个N(2<N<=10或N=16)进制数M。
输出
最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。
样例输入
9 87
样例输出
6

高精度题的思路是把数据存于数组进行处理,其个别题型在Java语言中可以使用BigInteger BigDecimal 进行处理。
C语言解决这题型时一般采用将数组的数据长度存放在A[0]头元素,Java也可。

此处是使用传统的数组解题,数组长度单独存放在cur变量中:
因为是n进制所以把
当前位规范从A[i]%10 到 A[i]%n
进位规范从A[i]/10 改成 A[i]/n

import java.util.Scanner;


public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		String str=sc.next();  //字符串接收输入
		
		int[] a=new int[100000];
		int[] b=new int[100000];
		int cur=str.length();   //此时数据长度为str长
		for(int i=0;i<str.length();i++){   //存放入int数组
			if(str.charAt(i)>='0' && str.charAt(i)<='9') a[i]=str.charAt(i)-'0';
			else if(str.charAt(i)>='A' && str.charAt(i)<='Z') a[i]=str.charAt(i)-'A'+10;
			else a[i]=str.charAt(i)-'a'+10;   //90%正确的是因为未考虑小写字母的情况。。。。
		}
		int ans=0;
		while(true){
			if(ans>30){  //加法超过30次,则退出
				System.out.println("Impossible");
				break;
			}
			else{
				if(huiwen(a,cur)){  //判断是否回文
					System.out.println(ans);
					break;
				}
											
				for(int i=0;i<cur;i++)  b[i]=a[cur-i-1];//初始化b数组
				//高精度加法模板
				for(int i=0;i<cur;i++)	a[i]+=b[i];
				for(int i=0;i<cur;i++){   //  
					a[i+1]+=a[i]/n;		//
					a[i]%=n;			//
				}						//
				if(a[cur]>0)	cur++;  //(如果最高位有进位,数据长加1)
				//
				ans++;
			}
		}
	}
	
	static boolean huiwen(int[] a,int cur){  
		for(int i=0;i<cur;i++)
			if(a[i]!=a[cur-i-1]) 
				return false;
		return true;
	}
}

发布了23 篇原创文章 · 获赞 10 · 访问量 4989

猜你喜欢

转载自blog.csdn.net/Fzidx/article/details/104215697