50,530
社区成员
发帖
与我相关
我的任务
分享
/**
* calculate black hole number
*/
public int getSubBlackHoleNum(int i) {
t=0;
int n = getCountOfNum(i);
println("length:"+n);
// 由高到低取出被计算数各位并存入数组
int arr[] = new int[n];
for (int j = 0; j < n; j++) {
int tmp = (int) Math.pow(10, n - j - 1);
if (j == 0) {
arr[j] = i / tmp;
} else {
arr[j] = i / tmp % 10;
}
}
//条件check,要求各个位不能全部相等
boolean bool= true;
for(int m = 0;m<arr.length-1;m++){
if(arr[m]!=arr[m+1]){
bool = false;
}
}
if(!bool){
// 对数组进行升序排序
ArrayList<Integer> list1 = bubbleSortAsc(arr);
// 将位还原成数min
int min = 0;
for (int k = 0; k < list1.size(); k++) {
int q = list1.get(k);
int p = (int) Math.pow(10, list1.size() - k - 1);
min += q * p;
}
print("min:" + min+" ");
// 对数组进行降序排序
ArrayList<Integer> list2 = bubbleSortDesc(arr);
// 将位还原成数max
int max = 0;
for (int k = 0; k < list2.size(); k++) {
int q = list2.get(k);
int p = (int) Math.pow(10, list2.size() - k - 1);
max += q * p;
}
print("max:" + max+" ");
int result = max-min;
println("result:"+result);
if(result==getSubBlackHoleNum(result)){
return result ;
}
}
return 0;
}
/**
* count the length of a number
*
*/
int t = 0;
public int getCountOfNum(int i){
if(i/10!=0){
t++;
getCountOfNum(i/10);
}
return t+1;
}
/**
* Bubble sort By asc
*
* @param arr
* @return
*/
public ArrayList<Integer> bubbleSortAsc(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
// println("j:"+j);
int tmp = 0;
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
// println("i:"+i);
}
ArrayList<Integer> list = new ArrayList<Integer>(arr.length);
for (int i = 0; i < arr.length; i++) {
list.add(arr[i]);
}
return list;
}
/**
* Bubble sort By desc
*
* @param arr
* @return
*/
public ArrayList<Integer> bubbleSortDesc(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
// println("j:"+j);
int tmp = 0;
if (arr[j] < arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
// println("i:"+i);
}
ArrayList<Integer> list = new ArrayList<Integer>(arr.length);
for (int i = 0; i < arr.length; i++) {
list.add(arr[i]);
}
return list;
}
public void testGetSubBlackHoleNum(){
print(mu.getSubBlackHoleNum(1245));
}
public static void main(String[] args) {
int num = 1245, v, count = 100; // 这里为了防止无限循环设置了阀值. 5位数及以上会出现无限循环.
while ((v = sub(num)) != num && count-->0) {
num = v;
}
System.out.println(v);
}
static int sub(int num) {
int[] _v = new int[10];
int len = 0;
while (num > 0) {
_v[len++] = num % 10;
num /= 10;
}
int[] v = Arrays.copyOf(_v, len);
Arrays.sort(v);
int max = 0, min = 0;
for (int i = 0; i < len; i++) {
min = min * 10 + v[i];
max = max * 10 + v[len - i - 1];
}
return max - min;
}
public class Main {
public static void main(String[] args) {
// 这里还有个不能是全部相同的数字判断,就不写了
System.out.println(returnblacknum("2884", 0));
}
// 如果超过7次或者排列后只差等于自身,返回
private static String returnblacknum(String s, int count) {
if ((count > 7) || cut(s).equals(Integer.parseInt(s))) {
return s;
}
return returnblacknum(cut(s), count + 1);
}
// 排列后两个数的差
private static String cut(String s) {
int max,min;
String[] ss = s.split("");
Arrays.sort(ss);
s = "";
for (String s1 : ss) {
s = s + s1;
}
min = Integer.parseInt(s);
max = Integer.parseInt(new StringBuilder(s).reverse().toString());
return new StringBuilder().append(max - min).toString();
}
}
package com.wgp.util;
import java.util.ArrayList;
import java.util.Scanner;
public class BlackNumUtil {
static String LINE = "--------------------------------------------------------------";
/**
* 全局变量cutList,用于存放最终的黑洞数
*/
static ArrayList<Integer> cutList = new ArrayList<Integer>();
/**
* 全局变量t,用于计算输入值位数
*/
static int t = 0;
/**
* 全局变量id,显示计算次数
*/
static int id = 1;
/**
* create a new line
*/
public static void println() {
System.out.println();
}
/**
* create the content with a new line
*
* @param o
*/
public static void println(Object o) {
System.out.println(o);
}
/**
* create the content without a new line
*
* @param o
*/
public static void print(Object o) {
System.out.print(o);
}
/**
* 获取数字位数
* @param i
* @return
*/
public static int getCountOfNum(int i) {
if (i / 10 != 0) {
getCountOfNum(i / 10);
t++;
}
return t + 1;
}
/**
* 正序冒泡排序
*
* @param arr
* @return list
*/
public static ArrayList<Integer> bubbleSortAsc(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
int tmp = 0;
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
ArrayList<Integer> list = new ArrayList<Integer>(arr.length);
for (int i = 0; i < arr.length; i++) {
list.add(arr[i]);
}
return list;
}
/**
* 倒序冒泡排序
*
* @param arr
* @return list
*/
public static ArrayList<Integer> bubbleSortDesc(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
int tmp = 0;
if (arr[j] < arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
ArrayList<Integer> list = new ArrayList<Integer>(arr.length);
for (int i = 0; i < arr.length; i++) {
list.add(arr[i]);
}
return list;
}
/**
* 将传入参数做数字正排列(有小到大 :min值)和倒排列(由大到小:max值),计算差值max-min
*
* @param i
* @return
*/
public static int cut(int i) {
print("id:"+id+" ");
id++;
print("initial value:" + i + " ");
t = 0;
int n = getCountOfNum(i);
// 由高到低取出被计算数各位并存入数组
int arr[] = new int[n];
for (int j = 0; j < n; j++) {
int tmp = (int) Math.pow(10, n - j - 1);
if (j == 0) {
arr[j] = i / tmp;
} else {
arr[j] = i / tmp % 10;
}
}
//判断数字的每一位是否相等
Boolean bool = true;
for (int m = 0; m < arr.length - 1; m++) {
if (arr[m] != arr[m + 1]) {
bool = false;
}
}
if (!bool) {
// 对数组进行升序排序
ArrayList<Integer> list1 = bubbleSortAsc(arr);
// 将数组计算为数字min
int min = 0;
for (int k = 0; k < list1.size(); k++) {
int q = list1.get(k);
int p = (int) Math.pow(10, list1.size() - k - 1);
min += q * p;
}
print("min:" + min + " ");
// 对数组进行降序排序
ArrayList<Integer> list2 = bubbleSortDesc(arr);
// 将数组计算为数字max
int max = 0;
for (int k = 0; k < list2.size(); k++) {
int q = list2.get(k);
int p = (int) Math.pow(10, list2.size() - k - 1);
max += q * p;
}
print("max:" + max + " ");
int cut = max - min;
println("max-min=" + cut);
return cut;
}
println();
return 0;
}
/**
* 将cut值放入全局变量cutList中
* @param cut
* @return cutList
*/
public static ArrayList<Integer> setCutToList(int cut) {
cutList.add(cut);
return cutList;
}
/**
* 递归计算,直到出现这样一个值,它在这样一个集合之中(这个集合就是每一次递归计算的max-min的合集),递归结束后返回这个值
*
*/
public static int getSameValInList(int i) {
int cut = cut(i);
ArrayList<Integer> ct = setCutToList(cut);
if (ct.get(ct.size()-1) == 0) {
println();
print("不能输入各位完全相同的数字!");
return 1;
}
for (int j = 0; j < ct.size() - 1; j++) {
if (cut == ct.get(j)) {
return i;
}
}
return getSameValInList(cut);
}
/**
* 得到最终的黑洞数集合
* @param i
* @return li
*/
public static ArrayList<Integer> getFinalList(int i) {
getSameValInList(i);
ArrayList<Integer> li = new ArrayList<Integer>();
int lastIndex = cutList.size() - 1;
int last = cutList.get(lastIndex);
int firstIndex = cutList.indexOf(last);
for (int j = firstIndex; j < lastIndex; j++) {
li.add(cutList.get(j));
}
return li;
}
/**
* 可以循环计算
*/
public static void roopCount(){
while (true) {
t=0;
cutList.clear();
Scanner input = new Scanner(System.in);
println("请输入任意一个正整数(退出请输0):");
int a = input.nextInt();
if(a==0){
print("Exit!");
break;
}
int n = getCountOfNum(a);
if(n<=2){
println("输入的值必须为三位数以上且各位不能全部相等!");
println(LINE);
continue;
}
ArrayList<Integer> li = getFinalList(a);
println();
int size = li.size();
if (size != 0 ) {
println(n + "位的黑洞数或黑洞数集合是:" + li);
}
println(LINE);
}
}
/**
* main 方法
* @param args
*/
public static void main(String args[]) {
roopCount();
}
}