蓝桥杯-------基础训练--特殊回文数,特殊的数字,回文数(JAVAdaima)

一、特殊回文数

     问题描述:123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

      解题思想:这个题要求的搜索范围很大,要求写出所有满足条件的五位和六位十进制数。而满足条件的限定:【第一个位数】乘以2+【第二个位数】乘以2+【第三个位数】乘以2等于n的值;或者第一个位数】乘以2+【第二个位数】乘以2+【第三个位数】等于n的值即可。而且这道题有一个最让人讨厌的点就是:“按从小到大的顺序输出满足条件的整数,每个整数占一行” 涉及到了排序。所以我使用了ArrayList数组,它可以创建一个对象,然后向数组中添加数据,最后再利用Collections类的sort()方法对ArrayList数组的对象进行排序即可满足题目的要求。其实实现搜索范围时,也用到了我的另一篇博客:有关全排列的知识。下面给出相应代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class 特殊回文数 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		ArrayList<Integer> rs = new ArrayList<Integer>();   
		for(int i = 1;i<10;i++)
			for(int j = 0;j<10;j++)
				for(int k = 0;k<10;k++)
				{
					if(2*i+2*j+k==n)
						rs.add(i*10000+j*1000+k*100+j*10+i);
					if(2*i+2*j+2*k==n)
						rs.add(i*100000+j*10000+k*1000+k*100+j*10+i);
					
				}
		Collections.sort(rs);    
		for(int i = 0; i<rs.size();i++)
		{
			System.out.println(rs.get(i));
		}

	}

}

上面代码就是将我上文所说的解题思想代码化的结果。

二、特殊的数字

   问题描述:153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。按从小到大的顺序输出满足条件的三位十进制数。

   解题思想:其实算法竞赛的人都做过这个题,他有一个别名叫水仙花数,需要满足的条件就是每个位数的3此方求和即为该数本身。与上一题类似,搜索仍然采用全排列的方式,而限定的条件:【第一个位数】的3此方+【第二个位数】3此方+【第三个位数】3此方=该数本身。而可变数组与排序均采用上文提到的ArrayList数组,以及Collection类的sort()方法进行实现的。

下面给出解题代码:

import java.util.ArrayList;
import java.util.Collections;
public class 特殊的数字 {
	public static void main(String[] args) {
		ArrayList<Integer> rs = new ArrayList<Integer>(); 
		for(int i = 1;i<10;i++)
			for(int j = 0;j<10;j++)
				for(int k = 0;k<10;k++)
				{
					if(i*i*i+j*j*j+k*k*k==i*100+j*10+k)
					{
						rs.add(i*100+j*10+k);
					}
				}
		Collections.sort(rs);
		for(int i = 0; i<rs.size();i++)
		{
			System.out.println(rs.get(i));
		}

	}

}

三、回文数

    问题描述:1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。按从小到大的顺序输出满足条件的四位十进制数。

    解题思想:其实与前两个题的方法完全是一样的,还是限定条件:第一个位数】乘以2+【第二个位数】乘以2=该数本身。此处就不做更多的解释了。下面给出解题代码:

import java.util.ArrayList;
import java.util.Collections;

public class 回文数 {
	public static void main(String[] args) {
		ArrayList<Integer> rs = new ArrayList<Integer>();
		for(int i = 1; i < 10; i++)
		{
			for(int j = 0; j < 10; j++)
			{
				rs.add(i*1000+j*100+j*10+i);
			}
		}
		Collections.sort(rs);
		for(int k = 0; k < rs.size(); k++)
		{
			System.out.println(rs.get(k));
		}
				
	}

}

若有疑问可留言!!!!!!!!!!

### 特殊回文数的定义 特殊回文数是指既满足特定条件又具有回文结构的整数。对于此类数值,在编程中通常涉及两个主要操作:一是验证一个给定数字是否构成这样的特殊形式;二是基于一定规则生成符合条件的新实例。 ### 判定与生成逻辑 为了在 Java 中实现上述功能,可以采用如下策略: #### 方法一:直接构建法 此方式适用于已知范围内的查找任务。通过遍历指定区间内所有可能候选者并逐一检验其属性来完成目标。具体而言,先构造出一系列基础形态(即最简单的回文序列),再逐步扩展直至达到预期长度或特性匹配为止[^1]。 ```java public boolean isPalindrome(int num){ String strNum = Integer.toString(num); int left=0,right=strNum.length()-1; while (left<right){ if(strNum.charAt(left++)!=strNum.charAt(right--)){ return false; } } return true; } ``` #### 方法二:迭代调整方案 当面对更复杂的场景时,则可考虑运用动态规划的思想来进行求解。这里的关键在于维护一组状态变量用于记录当前最优解及其相关信息,并据此指导后续决策过程中的更新方向。例如,在寻找最小素数回文的过程中,每当发现一个新的合格选项后便立即停止进一步探索,从而有效减少不必要的计算开销[^3]。 ```java import java.math.BigInteger; public class SpecialPalindromeFinder { private static final BigInteger TWO = BigInteger.valueOf(2); public static BigInteger findSmallestPrimePalindrome(BigInteger n) { while (!isPrime(n) || !isPalindrome(n)) { n = nextPalindrome(n.add(TWO)); } return n; } private static boolean isPrime(BigInteger number) { return number.isProbablePrime(10); // 使用内置方法检测概率性素数 } private static boolean isPalindrome(BigInteger number) { String s = number.toString(); int length = s.length(); for (int i = 0; i < length / 2; ++i) { if (s.charAt(i) != s.charAt(length - 1 - i)) return false; } return true; } private static BigInteger nextPalindrome(BigInteger current) { char[] digits = current.toString().toCharArray(); int size = digits.length; // 找到第一个不相等的位置 int mid = size >> 1, oddSize = size & 1; for (int i = mid - 1 + oddSize; i >= 0 && digits[i] == digits[size - 1 - i]; --i); // 如果整个数字已经是最大值则增加一位 if (mid <= 0 || digits[mid - 1 + oddSize] > digits[mid]) { Arrays.fill(digits, '9'); digits = new char[digits.length + 1]; digits[0] = '1'; digits[digits.length - 1] = '1'; } else { // 否则只改变中间部分 for (; mid >= 0;) { if (++digits[mid] > '9') { digits[mid++] = '0'; } else break; } for (int l = oddSize ? mid : mid - 1, r = size - 1 - ((size + 1) >> 1); l >= 0; --l, ++r) digits[r] = digits[l]; } return new BigInteger(new String(digits)); } } ``` 以上代码展示了如何利用辅助函数 `nextPalindrome` 来获取下一个更大的回文数,并结合质数检查实现了对特殊回文数的有效检索[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值