首页 > 学院 > 开发设计 > 正文

寒假20:算法训练 回文数

2019-11-10 17:24:24
字体:
来源:转载
供稿:网友

 算法训练 回文数  时间限制:1.0s   内存限制:256.0MB      锦囊1模拟。锦囊2每次对于当前数均使用题设给出的方法模拟出下一个数,再判断是不是回文数。 在模拟的时候,最好使用一个数组来表示数字,使用高精度计算的方法来处理数的加和回文数的判断。问题描述  若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。  例如:给定一个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(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。  如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”输入格式  两行,N与M输出格式  如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)样例输入987样例输出STEP=6

这个题是之前在别的学校比赛练习系统上遇到过的,之前好像没有说有超过十进制的。当时不能提交了,但是写出来了。

代码(十六进制的没有考虑进去):

import java.util.Scanner;public class B {	public static void main(String[] args) {				Scanner sc=new Scanner(System.in);		int k=sc.nextInt();		String num=sc.nextInt()+"";		boolean fa=getBool(num);		int conut=0;		while(fa==false){			String str=getAdd(k,num);			num=str;			fa=getBool(str);			conut++;			if(conut==30){				System.out.PRintln("Impossible!");				return;			}		}		System.out.println("STEP="+conut);	}	private static boolean getBool(String str) {		int le=str.length();		for (int i = 0; i < le/2; i++) {			if(str.charAt(i)!=str.charAt(le-i-1)){				return false;			}		}		return true;	}	//K进制的加法	private static String getAdd(int k,String num) {		String str="";		int jw=0;		int le=num.length()-1;		for (int i = num.length()-1; i >= 0; i--) {			int x=(num.charAt(i)+num.charAt(le-i))-2*'0'+jw;			str=x%k+str;			jw=x/k;		}		if(jw==1)			str=1+str;		return str;	}}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表