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

原创 2017年07月12日 08:21:31

--------------------------------------------------------------------------------------------------------------------------------------------------------

时间限制: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位正整数,请编写程序演示到达黑洞的过程。
输入描述:
输入给出一个(0, 10000)区间内的正整数N。
输出描述:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差
出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格式输出。
输入例子:
6767
输出例子:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

--------------------------------------------------------------------------------------------------------------------------------------------------------

实现思路:

(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;
                    }
                }
            }
        }
    }

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

算法导论第13(十三)章红黑树

红黑树是一般的二叉查找树的一种较为”平衡的“
  • z84616995z
  • z84616995z
  • 2014年06月22日 18:33
  • 4226

算法导论13.3插入 练习总结

13.3-1 在 RB-INSERT 的第 16 行,将心插入的结点 z 着为红色。注意到,如果将 z 着为黑色,则红黑树的性质 4 就不会被破坏。那么为什么不选择将 z 着为黑色呢? ANSWER:...
  • chan15
  • chan15
  • 2015年10月15日 23:27
  • 1086

CCF计算机软件能力认证模拟试题(c/c++)

CCF计算机软件能力认证模拟试题(c/c++)
  • nameofcsdn
  • nameofcsdn
  • 2016年12月05日 22:21
  • 2177

白话经典算法系列之十二 数组中只出现1次的两个数字(百度面试题)

首先来看题目要求:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现,要求尽快找出这个数字。...
  • u013474436
  • u013474436
  • 2015年09月24日 19:59
  • 219

【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)

首先来看题目要求: 在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。     考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现...
  • suifcd
  • suifcd
  • 2014年10月12日 22:33
  • 361

【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)

系列文章地址:http://blog.csdn.net/MoreWindows/article/category/859207 首先来看题目要求: 在一个数组中除两个数字只出现1次外,其它数字都出...
  • xiaolang85
  • xiaolang85
  • 2013年09月04日 19:14
  • 743

白话经典算法系列之十二 数组中只出现一次的两个数字(百度面试题)

微博http://weibo.com/MoreWindows已开通,欢迎关注。本系列文章地址:http://blog.csdn.net/MoreWindows/article/category/859...
  • a20180825
  • a20180825
  • 2017年08月04日 09:17
  • 1439

【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)

原文地址:http://blog.csdn.net/morewindows/article/details/8214003 首先来看题目要求: 在一个数组中除两个数字只出现1次外,其它...
  • ly_haierubic
  • ly_haierubic
  • 2015年01月23日 17:17
  • 290

蓝桥杯题目练习之数字黑洞

题目描述: 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述...
  • Crazy_Frog
  • Crazy_Frog
  • 2014年03月18日 01:00
  • 664

PAT练习-数字黑洞

题目描述 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞...
  • hailanglaoren
  • hailanglaoren
  • 2017年06月22日 11:11
  • 88
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法题练习系列之(十二): 数字黑洞
举报原因:
原因补充:

(最多只允许输入30个字)