首页 > 试题广场 >

1019. 数字黑洞 (20)

[编程题]1019. 数字黑洞 (20)
  • 热度指数:38203 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到
一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。

例如,我们从6767开始,将得到

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...

现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入描述:
输入给出一个[1000, 10000)区间内的正整数N。


输出描述:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格
式输出。
示例1

输入

6767

输出

7766 - 6677 = 1089<br/> 9810 - 0189 = 9621<br/> 9621 - 1269 = 8352<br/> 8532 - 2358 = 6174
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.next();
        heiDong(s1);
    }

    public static void heiDong(String s1) {
        //相等
        String s = "";
        s = chang4(s1);
        int x = s.charAt(0) - '0';
        int count = 1;
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) - '0' == x) {
                count++;
            }
        }
        if (count == 4) {
            System.out.println(s + " - " + s + " = 0000");
        } else {
            //不相等
            int cha = 0;
            while (cha != 6174) {
                int[] a = new int[s.length()];
                String min = "";
                String max = "";
                for (int i = 0; i < s.length(); i++) {
                    a[i] = s.charAt(i) - '0';
                }
                Arrays.sort(a);
                for (int i = 0; i < a.length; i++) {
                    min += a[i];
                }
                for (int i = a.length - 1; i >= 0; i--) {
                    max += a[i];
                }
                int max2 = Integer.parseInt(max);
                int min2 = Integer.parseInt(min);
                cha = max2 - min2;
                String cha2 = "";
                if (String.valueOf(cha).length() < 4) {
                    for (int i = 0; i < 4 - String.valueOf(cha).length(); i++) {
                        cha2 += '0';
                    }
                    cha2 += String.valueOf(cha);
                    System.out.println(max + " - " + min + " = " + cha2);
                } else {
                    System.out.println(max + " - " + min + " = " + cha);
                }
                s = chang4(String.valueOf(cha));
            }
        }
    }

    public static String chang4(String s1) {
        while (s1.length() < 4) {
            s1 += '0';
        }
        return s1;
    }
}

编辑于 2024-02-25 16:30:54 回复(0)
package io.github.haoranhsu;

import java.util.*;

public class Pat1009Second {
    public static void main(String[] args) {
        Scanner scanner= new Scanner(System.in);
        String num = scanner.nextLine();
        num = checkString(num);
        char[] chars = num.toCharArray();
        int result = 0;
        String type = "descending";
        if(getNum(chars,type) == -1){
            System.out.println("N - N = 0000");
            return;
        }
        while(result != 6174){
            int num1 = getNum(chars,type);
            type = "ascending";
            int num2 = getNum(chars,type);
            String num2String = String.valueOf(num2);
            int num2StringLen = num2String.length();
            result = num1 - num2;
            while(num2StringLen++ < 4){
                num2String = "0" + num2String;
            }
            System.out.println(num1 + " - " + num2String + " = " + result);
            type = "descending";
            chars = String.valueOf(result).toCharArray();
        }
    }
    private static String checkString(String num){
        int strLength = num.length();
        while(strLength++ < 4){
            num = num + "0";
        }
        return num;
    }
    private static int getNum(char[] chars,String type){
        List list = new ArrayList();
        for (int i = 0; i < chars.length; i++) {
            list.add(Integer.valueOf(String.valueOf(chars[i])));
        }
        if(type.equals("descending")){
            Collections.sort(list,Collections.reverseOrder());
        }else {
            Collections.sort(list);
        }
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < list.size(); i++) {
            builder.append(list.get(i));
        }
        if (list.get(0) == list.get(1) && list.get(1) == list.get(2) && list.get(2) == list.get(3)) {
            return -1;
        }
        return Integer.valueOf(builder.toString());
    }
}

发表于 2020-11-10 12:20:56 回复(0)
import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            String str = sc.nextLine();
            int res = Integer.valueOf(str);
            do {
                str = String.valueOf(res);
                while(str.length()<4){
                    str="0"+str;
                }
                int[] nums = new int[4];
                for (int i = 0; i < nums.length; i++) {
                    nums[i] = Integer.valueOf(str.substring(i, i + 1));
                    break;
                }
                Arrays.sort(nums);
                String str1 = "" + nums[0] + nums[1] + nums[2] + nums[3];
                String str2 = "" + nums[3] + nums[2] + nums[1] + nums[0];
                if (str1.equals(str2)) {
                    System.out.println(str1 + " - " + str1 + " = 0000");
                    break;
                }
                res = Integer.valueOf(str2) - Integer.valueOf(str1);
                System.out.println(str2 + " - " + str1 + " = " + res);
            } while (res != 6174);
        }
    }
}
//我的思路是:字符串和整型之间的互转,如果结果小于四位数,例如2111-1112=999,就在前面补0,0999;
//

发表于 2019-08-23 02:15:36 回复(1)
importjava.util.Arrays;
importjava.util.Comparator;
importjava.util.Scanner;
publicc***in {
publicstaticvoidmain(String[] args)
{
int num;
int[] a = newint[5];
Scanner sc = newScanner(System.in);
num = sc.nextInt();
if(num==6174)
{
System.out.println(7641+ " - "+ 1467+ " = "+ 6174);
}
else{
while(num != 6174) {
a[1] = num / 1000;
a[2] = num / 100% 10;
a[3] = num / 10% 10;
a[4] = num % 10;
if(a[1] == a[2] && a[2] == a[3] && a[3] == a[4]) {
System.out.println(num + " - "+ num + " = "+ "0000");
break;
}
Arrays.sort(a);
String min = (""+ a[1] + a[2] + a[3] + a[4]);
String max = newStringBuffer(""+ a[1] + a[2] + a[3] + a[4]).reverse().toString();
num = Integer.valueOf(max) - Integer.valueOf(min);
System.out.println(max + " - "+ min + " = "+ num);
}
}
}
}

编辑于 2019-05-22 13:16:52 回复(0)

终于可以AC啦!!!

import java.util.Arrays;
import java.util.Scanner;

public clas***ain {

    public static int method(int i){
        char[] chars = String.format("%04d",i).toCharArray();
        Arrays.sort(chars);
        int bigNum =
                Integer.parseInt(new StringBuffer().append(chars).reverse().toString());
        int ***allNum =
                Integer.parseInt(String.valueOf(chars));

//        int bigNum = Integer.parseInt(new StringBuffer(***allNum).reverse().toString());
        System.out.println( String.format("%04d",bigNum) + " - " + String.format("%04d",***allNum) + " = " + String.format("%04d",bigNum - ***allNum));
        if (bigNum-***allNum==6174){
            return 6174;
        }else {
            return method(bigNum-***allNum);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        char[] chars = String.format("%04d",i).toCharArray();
        if (i==3333){
            System.out.println("3333 - 3333 = 0000");
        }
        else if (chars[0]==chars[1]&&chars[1]==chars[2]&&chars[2]==chars[3]){
            System.out.println("N - N = 0000");
        }else {
            while (true){
                if (method(i)==6174){
                    break;
                }
            }
        }
    }
}

发表于 2019-05-16 14:29:15 回复(0)
import java.util.Arrays;
import java.util.Scanner;
public class Main {
 public static void cha(String s) {
  char[]nn=s.toCharArray();
  Arrays.sort(nn);
  int summin=0;
  for(int i=0;i<4;i++) {
   summin+=((nn[i]-'0')*Math.pow(10,3-i));
  }
  int summax=0;
  for(int i=3;i>=0;i--) {
   summax+=((nn[i]-'0')*Math.pow(10,i));
  }
  int ch=summax-summin;
  if(ch!=6174) {
   System.out.println(summax+" - "+String.format("%04d",summin)+" = "+String.format("%04d",ch));
   cha(String.format("%04d",ch));
  }
  else {
   System.out.println(summax+" - "+String.format("%04d",summin)+" = "+String.format("%04d",ch));
  }
 }
 public static void main(String[] args) {
  Scanner in=new Scanner(System.in);
  while(in.hasNext()) {
  String n=in.next();
  for(int i=n.length();i<4;i++) {
   n+="0";
  }
  char[]mm=n.toCharArray();
  Arrays.sort(mm);
  if(mm[0]==mm[3]) {
   System.out.println(n+" - "+n+" = 0000");
  }
  else {
   cha(n);
  }
 }
}
}

发表于 2019-03-11 20:52:39 回复(0)
import java.util.Scanner;

public class Hero{
    public static void main(String[] args){
    Scanner sc=new Scanner(System.in);
    String N=sc.next();
    sc.close();
    if(Integer.parseInt(N)%1111==0) {
        System.out.print(fourWei(N)+" - "+fourWei(N)+" = 0000");
    }else {
    N=fourWei(String.valueOf(Integer.parseInt(N)));
    do{
        int temp=getReverseNum(N)[0]-getReverseNum(N)[1];
        System.out.println(fourWei(String.valueOf(getReverseNum(N)[0]))+" - "+fourWei(String.valueOf(getReverseNum(N)[1]))+" = "+fourWei(String.valueOf(temp)));
        N=fourWei(String.valueOf(getReverseNum(N)[0]-getReverseNum(N)[1]));
    }while(Integer.parseInt(N)!=6174) ;
    }
}
    public static int [] getReverseNum(String number) {
        int [] result=new int [2];
        char [] c=number.toCharArray();
        for (int i = 0; i < c.length-1; i++) {
            for (int j = i+1; j < c.length; j++) {
                if(c[j]>c[i]) {
                    char temp=c[i];
                    c[i]=c[j];
                    c[j]=temp;                
                    }
            }
        }
        result[0]=Integer.parseInt(new String(c));
        result[1]=Integer.parseInt(new String(new char[]{c[3],c[2],c[1],c[0]}));
        return result;
    }
    public static String fourWei(String num) {
        if(Integer.parseInt(num)<1000){
            num=(Integer.parseInt(num)<10)?("000"+num):(Integer.parseInt(num)<100)?("00"+num):("0"+num);
            }
        return num;
    }
}






































编辑于 2018-05-31 23:42:42 回复(0)
package demo;

import java.util.Arrays;
import java.util.Scanner;

public class TestDemo1 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String s = in.nextLine();
		int count=0;
		if (s.length()==4) {
			for (int i = 0; i < s.length()-1; i++) {//判断是否四个字母都相同
				if (s.charAt(i)==s.charAt(i+1)) {
					count++;
				}
			}
		}
		if ("6174".equals(s)) {
			System.out.println("7641 - 1467 = 6174");
		}else if (count==3) {
			System.out.println(Integer.valueOf(s)+" - "+Integer.valueOf(s)+" = 0000");
		}else
			fun(s);
	}
	public static void fun(String num) {
		
		String str="";
		for (int i = 0; i <4-num.length(); i++) {
			str+="0";
		}
		num+=str;
		String left=sortright(num),right=sortleft(num);
		if (left.length()<4) {
			for (int i = 0; i < 4-left.length(); i++) {
				System.out.print("0");
			}
		}else {
			System.out.print(left);
		}
		System.out.print(" - ");
		if (right.length()<4) {
			for (int i = 0; i < 4-right.length(); i++) {
				System.out.print("0");
			}
		}else {
			System.out.print(right);
		}
		System.out.print(" = ");
		int result=Integer.valueOf(left)-Integer.valueOf(right);
		System.out.println(result);
		if (result==6174) {
			return;
		}
		fun(result+"");
	}
	public static String sortleft(String num) {
		char a[]=num.toCharArray();
		Arrays.sort(a);
		return new String(a);
	}
	public static String sortright(String num) {
		char a[]=num.toCharArray();
		Arrays.sort(a);
		for (int i = 0; i < 2; i++) {
			char temp=a[i];
			a[i]=a[3-i];
			a[3-i]=temp;
		}
		return new String(a);
	}
}


发表于 2018-05-12 10:36:50 回复(0)
好坑的一道题,题目和测试用例完全对不上,就如题目上所说如果N的四位数字全相等,则输出"N - N =0000",结果呢?测试用例3333怎么回事?
import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int c = n;
        while(true) {
            int a = getUpper(c);//递减排序
            int b = getLowwer(c);//递增排序
            c = a-b;
            if(b==0) {
                //System.out.println("N - N = 0000");
                break;
            }else {
                System.out.println(checkInteger(a)+" - "+checkInteger(b)+" = "+checkInteger(c));
                if(c==6174) {
                    break;
                }
            }
        }
    }
    //输出格式化
    public static String checkInteger(int i) {
        String str = String.valueOf(i);
        while(str.length()<4) {
            str="0"+str;
        }
        return str;
    }
    public static int getLowwer(int i) {
        char[] Lower = String.valueOf(i).toCharArray();
        Arrays.sort(Lower);
        String str = new String();
        for(char s: Lower) {
            str=str+s;
        }
        return Integer.valueOf(str);
    }
    public static int getUpper(int i) {
        String strs = String.valueOf(i);
        while(strs.length()<4) {
            strs=strs+"0";
        }
        char[] iUpper = strs.toCharArray();
        Arrays.sort(iUpper);
        String str = new String();
        for(char s: iUpper) {
            str=s+str;
        }
        return Integer.valueOf(str);
    }
}

发表于 2018-05-04 13:41:16 回复(1)
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int number = sc.nextInt();
		int arr [] = new int [4];
		if(number == 6174){
			arr[0] = number/1000;
			arr[1] = (number%1000)/100;
			arr[2] = (number%100)/10;
			arr[3] = number%10;
			arr = sort(arr);
			number = (arr[3]*1000+arr[2]*100+arr[1]*10+arr[0])
					-(arr[0]*1000+arr[1]*100+arr[2]*10+arr[3]);
			System.out.println(arr[3]+""+arr[2]+""+arr[1]+""+arr[0]+""+" - "
					+arr[0]+""+arr[1]+""+arr[2]+""+arr[3]+""+" = "
					+number+"");;
		}
		while(number != 6174 && number%1111 != 0){
			arr[0] = number/1000;
			arr[1] = (number%1000)/100;
			arr[2] = (number%100)/10;
			arr[3] = number%10;
			arr = sort(arr);
			number = (arr[3]*1000+arr[2]*100+arr[1]*10+arr[0])
					-(arr[0]*1000+arr[1]*100+arr[2]*10+arr[3]);
			System.out.println(arr[3]+""+arr[2]+""+arr[1]+""+arr[0]+""+" - "
								+arr[0]+""+arr[1]+""+arr[2]+""+arr[3]+""+" = "
								+number+"");
		}
		if(number % 1111 == 0){
			System.out.println(number+" - "+number+" = "+"0000");
		}
	}
	public static int[] sort(int arr []){
		for(int i=0;i<arr.length-1;i++){
			for(int j=i+1;j<arr.length;j++){
				if(arr[i]>arr[j]){
					int tmp =arr [i];
					arr[i] = arr[j];
					arr[j] = tmp;
				}
			}
		}
		return arr;
	}
}


发表于 2017-08-15 21:13:13 回复(0)

要留意不足4位的数字->字符串

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(new BufferedInputStream(System.in));
        String str=scan.nextLine();
        str=getStandardStr(Integer.valueOf(str));
        while(true){
            String strA=diJian(str);
            String strB=diZeng(str);
            int result=Integer.parseInt(strA)-Integer.parseInt(strB);
            if(result==0){
                System.out.println(strA+" - "+strB+" = 0000");
                return;
            }
            if(result==6174){
                System.out.println(strA+" - "+strB+" = 6174");
                return;
            }
            str=getStandardStr(result);
            System.out.println(strA+" - "+strB+" = "+str);
        }
    }
    public static String getStandardStr(int result){
        if(result>=1000) return new Integer(result).toString();
        if(result>=100) return "0"+result;
        if(result>=10) return "00"+result;
        return "000"+result;
    }

    public static String diZeng(String str){
        char[] chars=str.toCharArray();
        int min=0;
        for(int i=0;i<str.length();i++){
            min=i;
            for(int j=i+1;j<str.length();j++){
                if(chars[j]<chars[min]) min=j;
            }
            if(min==i) continue;
            char tmp=chars[i];
            chars[i]=chars[min];
            chars[min]=tmp;
        }
        return new String(chars);
    }
    public static String diJian(String str){
        char[] chars=str.toCharArray();
        int max=0;
        for(int i=0;i<str.length();i++){
            max=i;
            for(int j=i+1;j<str.length();j++){
                if(chars[j]>chars[max]) max=j;
            }
            if(max==i) continue;
            char tmp=chars[i];
            chars[i]=chars[max];
            chars[max]=tmp;
        }
        return new String(chars);
    }
}
编辑于 2017-03-26 16:00:22 回复(0)

import java.util.Arrays;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in= new Scanner(System.in);
int A=in.nextInt();
do
{
int[] a={0,0,0,0};
for(int i=0;i<4;i++)
{
a[i]=A%10;
A=A/10;
}
Arrays.sort(a);
int max=a[3]*1000+a[2]*100+a[1]*10+a[0];
int min=a[0]*1000+a[1]*100+a[2]*10+a[3];
A=max-min;
System.out.printf("%04d-%04d=%04d\n",max,min,A);
}while(A!=6174&&A!=0000);
}

}
请大神指点我的这个程序到底哪里有问题,望指教
发表于 2017-02-01 14:24:42 回复(0)
请输入正确的答案及解题思路
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String N1 = sc.next(); sc.close(); for(int x = N1.length(); x < 4; x++) N1 = "0" + N1; while (true) { char[] num = N1.toCharArray(); Arrays.sort(num); N1 = new String(num); StringBuilder sb = new StringBuilder(N1); String N2 = sb.reverse().toString(); if (N1.equals(N2)) { System.out.println(N2 + " - " + N1 + " = 0000"); break; } else { int a = Integer.parseInt(N1); int b = Integer.parseInt(N2); int sum = b - a; String strsum = new Integer(sum).toString(); for(int x = strsum.length(); x < 4; x++) { strsum = "0" + strsum; } System.out.println(N2+" - "+N1+" = "+strsum); if(sum == 6174) break; N1 = strsum; } } } } 注意当用户输入法N1不是4位数时,要把它添0至4位数; 注意字符串的反转
编辑于 2016-06-22 20:27:10 回复(0)

问题信息

难度:
15条回答 30146浏览

热门推荐

通过挑战的用户