特殊回文数和回文数(Java实现)

本文介绍了如何使用Java解决特殊回文数和回文数的问题。对于特殊回文数,提供了两种解决方案,一种是直接构造,另一种是遍历检查。在蓝桥杯比赛中,直接构造法在CPU时间上更优。而对于回文数,同样给出了两种方法,实际运行中,简单构造法效率更高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

紧锣密鼓的我又写了有关回文数的算法了,有关特殊回文数和回文数

一:特殊回文数

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

解题思路:有两种方法,第一是我们去构造这样的特殊回文数,首先我们看这个数的特点,因为是五位和六五数的回文数,所以我们可以根据前三位确定这个五位或者六位的数字,那满足的要求就是每个位数加起来的值为n,然后输出即可。第二种方法就是常用的方法了,遍历所有五位和六位的数,然后取出各个位数的值,判断相加是否是n+是否是回文数,这两个条件要同时满足。

编程思路:因为很简单就直接上代码了

代码实现(方法一):

import java.util.Scanner;

public class Main_specialpalindrome {
	public static void speicalpalindrome(int n) {
		int x,y,z;
		//先输出五位数
		for(int i=1;i<10;i++) {
			x=i;
			for(int j=0;j<10;j++) {
				y=j;
				z=n-2*x-2*y;
				if(z>=0&&z<10) {
					System.out.print(x);
					System.out.print(y);
					System.out.print(z);
					System.out.print(y);
					System.out.print(x);
					System.out.println();

			}
		}
	}
	//输出六位数
	if(n%2==0) {
		for(int i=1;i<10;i++) {
			x=i;
			for(int j=0;j<10;j++) {
				y=j;
				z=n/2-x-y;
				if(z>=0&&z<10) {
					System.out.print(x);
					System.out.print(y);
					System.out.print(z);
					System.out.print(z);
					System.out.print(y);
					System.out.print(x);
					System.out.println();
				}
			}
		}
	}
	
	}
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		speicalpalindrome(n);
		
	}
}

代码实现(方法二):

import java.util.Scanner;
//特殊回文数
public class Main_specialpalindrome01 {
	public static void specialpalindrome(int n) {
		int a,b,c,d,e,f;
		for(int i=10000;i<=99999;i++) {  //先遍历五位数  因为判断表达式稍稍有些不一样  所以我们分开遍历
			a=i/10000;
			b=i%10000/1000;
			c=i%10000%1000/100;
			d=i%10000%1000%100/10;
			e=i%10000%1000%100%10;
			if(a==e&&b==d&&a+b+c+d+e==n) {
				System.out.println(i);
			}
		}
		for(int j=100000;j<=999999;j++) {
			a=j/100000;
			b=j%100000/10000;
			c=j%100000%10000/1000;
			d=j%100000%10000%1000/100;
			e=j%100000%10000%1000%100/10;
			f=j%100000%10000%1000%100%10;
			if(a==f&&b==e&&c==d&&a+b+c+d+e+f==n) {
				System.out.println(j);
			}
		}

	}
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		specialpalindrome(n);
	}
}

两种方法分析:

  1. 在蓝桥杯的系统里面,第一种方法占用CUP的时间是250ms,而第二种方法占用的时间为281ms,所以第一种方法用的时间要少一些,但是两种方法都是满足了题目给定的时间要求的。
  2. 从时间复杂度来看,第一种方法的时间复杂度为n^2,而第一种方法的时间复杂度为n,但是这道题的n的数值不一样,所以第一种方法用的时间要少一些。

以上就是特殊回文数
/
/
/
二.回文数
问题描述: 输出所有四位的回文数

解题思路:这道题比上面的特殊回文数还要简单些,同样有两种方法。第一种方法和上面一样,甚至是更加的简单。(这里我两种方法都不在赘述了)

代码实现(方法一):

//输出所有四位数的回文数
public class Main_palindrome {
	public static void palindrome() {
		for(int i=1;i<10;i++) {
			for(int j=0;j<10;j++) {
				System.out.print(i);
				System.out.print(j);
				System.out.print(j);
				System.out.print(i);
				System.out.println();
			}
		}
	}
	public static void main(String[] args) {
		palindrome();
	}
	
}

代码实现(方法二):

//输出回文数   四位数的   这种方法只用到了一层循环  虽然循环的次数角较多  但是时间复杂度低
public class Main_palindrome01 {
	public static void palindrome() {
		int a,b,c,d;
		for(int i=1000;i<=9999;i++) {
			a=i/1000;
			b=i%1000/100;
			c=i%1000%100/10;
			d=i%1000%100%10;
			if(a==d&&b==c) {
				System.out.println(i);
			}
		}
	}
	public static void main(String[] args) {
		palindrome();
	}
}

算法分析: 和特殊回文数一样,第一种方法时间复杂度比第二种时间复杂度高,但是实际运行时,第一种方法占用CPU的时间要少一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值