紧锣密鼓的我又写了有关回文数的算法了,有关特殊回文数和回文数
一:特殊回文数
问题描述: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);
}
}
两种方法分析:
- 在蓝桥杯的系统里面,第一种方法占用CUP的时间是250ms,而第二种方法占用的时间为281ms,所以第一种方法用的时间要少一些,但是两种方法都是满足了题目给定的时间要求的。
- 从时间复杂度来看,第一种方法的时间复杂度为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的时间要少一些。