目录

1 问题描述

2 解决方案

2.1 80分解法

2.2 网友标答解法

 


1 问题描述

问题描述
  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
  输入一行,包含一个正整数n。
输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
  1<=n<=54。

2 解决方案

2.1 80分解法

初步看题,自己把题意给理解的太深奥了,对于输出的五位数和六位数,我以为00100也是符合要求的五位回文数,那么问题就来了,如何输出00100呢?其解法就只能使用字符串了,那么使用字符串后,问题又来了,如何对字符串进行从小到大排序呢?好吧,在这里又得把字符串转换成整数比较大小,计算排序位置,计算完后,再次输出字符串的顺序。说到这里,我个人感觉自己写的代码虽然复杂,但是计算的结果绝对比标答结果全,但是在蓝桥杯练习系统中判分却只有80分,郁闷,不过这次得吸取理解题意的教训了。

具体代码如下:

package com.liuzhen.systemExe;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set; public class Main{ public void getReverseN(int n){
Set<String> set = new HashSet<String>();
for(int i = 0;i < 10;i++){
int x1 = i;
for(int j = 0;j < 10;j++){
int x2 = j;
for(int k = 0;k < 10;k++){
int x3 = k;
if(2*(x1+x2)+x3 == n){
char[] temp = new char[5];
temp[0] = (char) (x1 + 48);
temp[1] = (char) (x2 + 48);
temp[2] = (char) (x3 + 48);
temp[3] = (char) (x2 + 48);
temp[4] = (char) (x1 + 48);
String tempS1 = String.valueOf(temp);
set.add(tempS1); temp[0] = (char) (x2 + 48);
temp[1] = (char) (x1 + 48);
temp[2] = (char) (x3 + 48);
temp[3] = (char) (x1 + 48);
temp[4] = (char) (x2 + 48);
String tempS2 = String.valueOf(temp);
set.add(tempS2);
}
if(2*(x1+x2+x3) == n){
char[] temp = new char[6];
temp[0] = (char) (x1 + 48);
temp[1] = (char) (x2 + 48);
temp[2] = (char) (x3 + 48);
temp[3] = (char) (x3 + 48);
temp[4] = (char) (x2 + 48);
temp[5] = (char) (x1 + 48);
String tempS1 = String.valueOf(temp);
set.add(tempS1); temp[0] = (char) (x1 + 48);
temp[1] = (char) (x3 + 48);
temp[2] = (char) (x2 + 48);
temp[3] = (char) (x2 + 48);
temp[4] = (char) (x3 + 48);
temp[5] = (char) (x1 + 48);
String tempS2 = String.valueOf(temp);
set.add(tempS2); temp[0] = (char) (x2 + 48);
temp[1] = (char) (x1 + 48);
temp[2] = (char) (x3 + 48);
temp[3] = (char) (x3 + 48);
temp[4] = (char) (x1 + 48);
temp[5] = (char) (x2 + 48);
String tempS3 = String.valueOf(temp);
set.add(tempS3); temp[0] = (char) (x2 + 48);
temp[1] = (char) (x3 + 48);
temp[2] = (char) (x1 + 48);
temp[3] = (char) (x1 + 48);
temp[4] = (char) (x3 + 48);
temp[5] = (char) (x2 + 48);
String tempS4 = String.valueOf(temp);
set.add(tempS4); temp[0] = (char) (x3 + 48);
temp[1] = (char) (x2 + 48);
temp[2] = (char) (x1 + 48);
temp[3] = (char) (x1 + 48);
temp[4] = (char) (x2 + 48);
temp[5] = (char) (x3 + 48);
String tempS5 = String.valueOf(temp);
set.add(tempS5); temp[0] = (char) (x3 + 48);
temp[1] = (char) (x1 + 48);
temp[2] = (char) (x2 + 48);
temp[3] = (char) (x2 + 48);
temp[4] = (char) (x1 + 48);
temp[5] = (char) (x3 + 48);
String tempS6 = String.valueOf(temp);
set.add(tempS6);
}
}
}
}
int len = set.size();
String[] result = new String[len];
int i = 0;
for(String tem : set)
result[i++] = tem;
int[] rI = getSort(result);
for(i = 0;i < len;i++){
int k = getMinI(rI);
System.out.println(result[k]);
rI[k] = len;
}
} public int[] getSort(String[] A){
int len = A.length;
int[] result = new int[len];
int[] tempResult = new int[len];
for(int i = 0;i < len;i++){
tempResult[i] = Integer.parseInt(A[i]);
}
for(int i = 0;i < len;i++){
int count = 0;
for(int j = 0;j < len;j++){
if(tempResult[i] > tempResult[j])
count++;
}
result[i] = count;
} return result;
} public int getMinI(int[] A){
int result = 0;
for(int i = 0;i < A.length;i++){
if(A[result] > A[i])
result = i;
}
return result;
} public static void main(String[] args){
//long t1 = System.currentTimeMillis();
Main test = new Main();
Scanner in = new Scanner(System.in);
System.out.println("请输入一个10进制整数:");
int n = in.nextInt();
test.getReverseN(n);
//long t2 = System.currentTimeMillis();
//System.out.println("耗时:"+(t2-t1)+"毫秒"); }
}

运行结果:

请输入一个10进制整数:
1
00100 请输入一个10进制整数:
2
00200
01010
001100
10001
010010
100001 请输入一个10进制整数:
52
899998
989989
998899

2.2 网友标答解法

具体代码如下:

package com.liuzhen.array_2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner; public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入数字n:");
int n=input.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));
} }

运行结果:

请输入数字n:
1 请输入数字n:
2
10001
100001 请输入数字n:
52
899998
989989
998899

最新文章

  1. 闲来无事,写个基于TCP协议的Socket通讯Demo
  2. NYOJ 461
  3. 点击页面任何位置隐藏div
  4. app store 上架流程
  5. Python 中的 TK编程
  6. java-----基本数据类型包装类
  7. Lua的function、closure和upvalue
  8. 简化 Django
  9. 对easyui datagrid进行扩展,当滚动条拉直最下面就异步加载数据。
  10. [LeetCode]题解(python):044-Wildcard Matching
  11. LaTeXの学习笔记
  12. 基于 socket.io 的 AI 服务 杂谈
  13. 转载(TCPClient 建立连接和断开连接函数)
  14. 4.翻译系列:EF 6 Code-First默认约定(EF 6 Code-First系列)
  15. 三重DEC加密在java中的实现
  16. windows 7 下安装Oracle 9i 解决方法[转]
  17. 2017-2018-2 《网络对抗技术》20155322 Exp7 网络欺诈防范
  18. python加速包numba并行计算多线程
  19. 一种时间复杂度为O(n)的排序方法(转载)
  20. Python全栈开发之4、内置函数、文件操作和递归

热门文章

  1. kotlin 类 接口 抽象类 子类类型有限的class 。sealed class
  2. Codeforces 372 B. Counting Rectangles is Fun
  3. [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))
  4. Test20171009 考试总结 NOIP模拟赛
  5. 【最小路径覆盖】BZOJ2150-部落战争
  6. [GCJ2017R2]Fresh Chocolate
  7. 2015 UESTC 数据结构专题B题 秋实大哥与花 线段树 区间加,区间查询和
  8. python - 在Windows系统中安装Pygame及导入Eclipse
  9. linux基础命令学习(一)系统的关机、重启以及注销
  10. Visual Studio删除所有的注释和空行