算法题练习系列之(十二): 数字黑洞
2017-07-12 08:21
281 查看
--------------------------------------------------------------------------------------------------------------------------------------------------------
时间限制:1秒 空间限制:32768K 代码长度限制 100 KB
--------------------------------------------------------------------------------------------------------------------------------------------------------
[b]输入描述:[/b]
[b]输出描述:[/b]
[b]输入例子:[/b]
[b]输出例子:[/b]
--------------------------------------------------------------------------------------------------------------------------------------------------------
[b]实现思路:[/b]
(1).将输入的数字转换为标准格式字符串(4位数,不够的补0);
(2).将数字字符串转换为字符数组,切对其按照数字字符从大到小进行排序得到M,从小到大排序得到N;
(3).将字符数组转换为数字进行相减,得到结果,判断是否为6174或0;如果是,结束;否,将结果作为输入数字继续执行该过程。
--------------------------------------------------------------------------------------------------------------------------------------------------------
package com.biyao.algorithm.niuke.a1;
import java.util.Scanner;
public class Main_a1_009 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int num = scan.nextInt();
String numStr = formatNum(num);
int res = 0;
while(res != 6174){
char[] numCharArr = numStr.toCharArray();
int[] numArr = new int[numCharArr.length];
for (int i = 0; i < numArr.length; i++) {
numArr[i] = (int)(numCharArr[i]-48);
}
sort(numArr,0);
int m = getNumByArr(numArr);
sort(numArr,1);
int n = getNumByArr(numArr);
res = m - n;
System.out.println(formatNum(m) + " - " + formatNum(n) + " = " + formatNum(res));
if(res == 0){
break;
}
numStr = formatNum(res);
}
}
}
public static int getNumByArr(int[]numArr){
int num = 0;
for (int i = 0; i < numArr.length; i++) {
num = num*10 + numArr[i];
}
return num;
}
public static String formatNum(int num){
if(num >= 100 && num < 1000){
return "0" + num;
}else if(num >= 10 && num < 100){
return "00" + num;
}else if(num >= 0 && num < 10){
return "000" + num;
}else{
return "" + num;
}
}
//type = 1 升序 ;type=0降序
public static void sort(int[]numArr,int type){
if(numArr == null || numArr.length == 0){
return ;
}
for (int i = 0; i < numArr.length; i++) {
for (int j = i; j < numArr.length; j++) {
if(type == 1){
if(numArr[i] > numArr[j]){
int temp = numArr[i];
numArr[i] = numArr[j];
numArr[j] = temp;
}
}else if(type == 0){
if(numArr[i] < numArr[j]){
int temp = numArr[i];
numArr[i] = numArr[j];
numArr[j] = temp;
}
}
}
}
}
}
时间限制:1秒 空间限制:32768K 代码长度限制 100 KB
--------------------------------------------------------------------------------------------------------------------------------------------------------
题目描述
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个 数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇 的数字也叫Kaprekar常数。 例如,我们从6767开始,将得到 7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174 7641 - 1467 = 6174 ... ... 现给定任意4位正整数,请编写程序演示到达黑洞的过程。
[b]输入描述:[/b]
输入给出一个(0, 10000)区间内的正整数N。
[b]输出描述:[/b]
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差 出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格式输出。
[b]输入例子:[/b]
6767
[b]输出例子:[/b]
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174
--------------------------------------------------------------------------------------------------------------------------------------------------------
[b]实现思路:[/b]
(1).将输入的数字转换为标准格式字符串(4位数,不够的补0);
(2).将数字字符串转换为字符数组,切对其按照数字字符从大到小进行排序得到M,从小到大排序得到N;
(3).将字符数组转换为数字进行相减,得到结果,判断是否为6174或0;如果是,结束;否,将结果作为输入数字继续执行该过程。
--------------------------------------------------------------------------------------------------------------------------------------------------------
package com.biyao.algorithm.niuke.a1;
import java.util.Scanner;
public class Main_a1_009 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int num = scan.nextInt();
String numStr = formatNum(num);
int res = 0;
while(res != 6174){
char[] numCharArr = numStr.toCharArray();
int[] numArr = new int[numCharArr.length];
for (int i = 0; i < numArr.length; i++) {
numArr[i] = (int)(numCharArr[i]-48);
}
sort(numArr,0);
int m = getNumByArr(numArr);
sort(numArr,1);
int n = getNumByArr(numArr);
res = m - n;
System.out.println(formatNum(m) + " - " + formatNum(n) + " = " + formatNum(res));
if(res == 0){
break;
}
numStr = formatNum(res);
}
}
}
public static int getNumByArr(int[]numArr){
int num = 0;
for (int i = 0; i < numArr.length; i++) {
num = num*10 + numArr[i];
}
return num;
}
public static String formatNum(int num){
if(num >= 100 && num < 1000){
return "0" + num;
}else if(num >= 10 && num < 100){
return "00" + num;
}else if(num >= 0 && num < 10){
return "000" + num;
}else{
return "" + num;
}
}
//type = 1 升序 ;type=0降序
public static void sort(int[]numArr,int type){
if(numArr == null || numArr.length == 0){
return ;
}
for (int i = 0; i < numArr.length; i++) {
for (int j = i; j < numArr.length; j++) {
if(type == 1){
if(numArr[i] > numArr[j]){
int temp = numArr[i];
numArr[i] = numArr[j];
numArr[j] = temp;
}
}else if(type == 0){
if(numArr[i] < numArr[j]){
int temp = numArr[i];
numArr[i] = numArr[j];
numArr[j] = temp;
}
}
}
}
}
}
相关文章推荐
- 【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)
- 【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)
- 算法题练习系列之(十五): D进制的A+B
- 算法题练习系列之(二十一): 人口普查
- 算法题练习系列之(二十): 打印沙漏
- 【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)
- 算法题练习系列之(二十七): 有理数四则运算
- 算法题练习系列之(十三): 月饼
- 算法题练习系列之(十一):锤子剪刀布
- 算法题练习系列之(二十四): 查验身份证
- 【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)
- PAT练习-数字黑洞
- 算法题练习系列之(二):矩阵最大值
- 算法题练习系列之(十四): 个位数统计
- 算法题练习系列之(七):福尔摩斯的约会
- 蓝桥杯题目练习之数字黑洞
- 算法题练习系列之(一):守形数
- 算法题练习系列之(五):数字分类
- 算法题练习系列之(十八): 反转链表
- 算法题练习系列之(二十五): 挖掘机技术哪家强