您的位置:首页 > 编程语言 > Java开发

算法题练习系列之(十二): 数字黑洞

2017-07-12 08:21 281 查看
--------------------------------------------------------------------------------------------------------------------------------------------------------

时间限制: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;
}
}
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息