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

原创 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;
                    }
                }
            }
        }
    }

}


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

相关文章推荐

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

微博http://weibo.com/MoreWindows已开通,欢迎关注。本系列文章地址:http://blog.csdn.net/MoreWindows/article/category/859...

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

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

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

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

算法题练习系列之(五):数字分类

----------------------------------------------------------------------------------------------------...

PAT练习-数字黑洞

题目描述 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞...

1019. 数字黑洞 (20)--做题记录

1019. 数字黑洞 (20) 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们...

数字图象处理之二维码图像提取算法(十二)

新年代码大放送: // test1.cpp : Defines the entry point for the console application. #include "stdafx.h" #...

[算法系列之十二]字符串匹配之蛮力匹配

引言字符串匹配是数据库开发和文字处理软件的关键。幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作。不过理解他们的原理还是比较重要的。字符串算法主要可以分为几类。字符串匹配就是其中之一。当我们...

简单的程序诠释C++ STL算法系列之十二:find_end

C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。        find_en...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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