[洛谷 OJ]P1015 回文数

news/2024/7/2 1:19:17 标签: 模拟, 字符串

题目描述

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

例如:给定一个十进制数56,将56加65(即把5656从右向左读),得到121是一个回文数。

又如:对于十进制数8787:

STEP1:87+78 = 165
STEP2:165+561 = 726
STEP3:726+627 = 1353
STEP4:1353+3531 = 4884

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

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

输入格式

两行,分别是N,M。

输出格式

STEP=ans

输入输出样例

输入 #1复制

10
87

输出 #1复制

STEP=4

 这个题我刚开始觉得它的sum可能会很大,然后就用的大数,结果发现,用String 字符串就可以了,你说神奇不神奇,然后再进行编码的时候要注意以下几点:

1.先求某个数的逆数(我是这样称呼的);

2.将这两个数全部转化为10进制,然后相加;

3.将和转化为相应的进制进行判断;

这样的结果是正确的;

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

public class  Main {
	static Scanner sc=new Scanner(System.in);
	static int N,S;  
	static String M;
	static char[] ch= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	static String reverse(String m2) {
		String m1="";
		String str=m2+"";
		for(int i=str.length()-1;i>=0;i--) {
			m1+=str.charAt(i);
		}
		return m1;
	}
	static String add(String m2) {
		// TODO Auto-generated method stub
		
		String m1=reverse(m2);
		long sum1=0;
		long sum2=0;
		long sum=0;
		for(int i=0;i<m2.length();i++) {
			sum1=sum1*N+(m2.charAt(i)>64?m2.charAt(i)-55:Long.parseLong(m2.charAt(i)+""));
		}
		for(int i=0;i<m1.length();i++) {
			sum2=sum2*N+(m1.charAt(i)>64?m1.charAt(i)-55:Long.parseLong(m1.charAt(i)+""));
		}
		sum=sum1+sum2;
		String str="";
		while(sum>0) {
			long dig=sum%N;
			str+=ch[(int) dig];
			sum/=N;
		}
		
		return reverse(str);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		N=sc.nextInt();
		S=N;
		M=sc.next();
		int ans=0;
		while(!isH(M)) {
			if(ans>30) {
				System.out.println("Impossible!");
				return;
			}
			M=add(M);
			ans++;
		}
		if(ans==0) {
			ans=1;
		}
		System.out.println("STEP="+ans);
		
	}
	static boolean isH(String m2) {
		// TODO Auto-generated method stub
		
		String str=m2+"";
		boolean flag=true;
		for(int i=0;i<((str.length()-1)/2+1);i++) {
			if(!(str.charAt(i)==str.charAt(str.length()-1-i))) {
				flag=false;
			}
		}
		return flag;
	}
	

}

 


http://www.niftyadmin.cn/n/1437092.html

相关文章

C# HashSetT类中增、删、清除方法(Add、Remove、Clear)实例解析

本文部分注释来源于书籍和网摘 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据关键字&#xff08;Key value&#xff09;而直接访问在内存存储位置的数据结构。 它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个…

【算法思想篇】高精度算法

高精度算法&#xff0c;属于处理大数字的数学计算方法。在一般的学科计算中&#xff0c;会经常算到小数点后几百位或者更多&#xff0c;当然也有可能是几千亿几百亿的的数字。一般对于这类数字我们通常称为高精度数&#xff0c;高精度算法是用计算机对于超大数据的一种模拟加减…

[洛谷 OJ]P1080 国王游戏

题目描述 恰逢 HH国国庆&#xff0c;国王邀请nn 位大臣来玩一个有奖游戏。首先&#xff0c;他让每个大臣在左、右手上面分别写下一个整数&#xff0c;国王自己也在左、右手上各写一个整数。然后&#xff0c;让这 nn 位大臣排成一排&#xff0c;国王站在队伍的最前面。排好队后&…

HashSet类求集合与集合之间是否为子集或超集

本文部分注释来源于书籍和网摘 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据关键字&#xff08;Key value&#xff09;而直接访问在内存存储位置的数据结构。 它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个…

HashSet类求集合与集合之间是否为真子集或真超集

本文部分注释来源于书籍和网摘 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据关键字&#xff08;Key value&#xff09;而直接访问在内存存储位置的数据结构。 它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个…

C#方法与方法的环回调用

所谓方法与方法间的环回调用就是方法A调用方法B&#xff0c;而方法A本身又调用方法B&#xff1b;这样方法A与方法B之间的调用就构成了一个闭合的环路。

[洛谷 OJ] P1233 木棍加工

先根据长度从高到低排序&#xff0c;如果长度相同&#xff0c;再根据宽度从高到低排序。 这样&#xff0c;这个问题就转化成了在n个数中&#xff0c;求不下降子序列最少个数。 从dilworth定理中&#xff0c;我们可知&#xff0c;下降子序列的最小划分等于最长不下降子序列的长…

字段与局部变量 C#

本文部分内容摘抄自书籍和官网。 局部变量的作用域仅限于声明它的方法主体内&#xff1b;方法结束&#xff0c;它也随之消失。字段存储的数据通常必须可以由不止一个类方法访问&#xff0c;并且存储的时间必须长于任何单个方法的生存期。