算法游戏-黑洞数(java实现)
2016-07-07 21:04
471 查看
首先描述一下什么是黑洞数,黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。
java实现代码如下:
1.黑洞数可能是一个,也可能是一组数,所以我用的是list来存储求出来的黑洞数
2.这里面主要的问题就是一些细节要注意,比如注意变量的改变情况,不要出现死循环,如果大家不知道问题出在哪里,可以使用debug运行模式来执行,这样就知道在哪里出现问题,知道哪个点需要修改。
测试结果:
三位数的黑洞数都是495
四位数的黑洞数都是6174
五位数的黑洞数就是上面四个,可能就是顺序不一样。
大家可以进行测试,当然如一位数,两位数还有每一位都是一样的比如999,这个当然黑洞数是0。
java实现代码如下:
public class Test2 { private int m = 0; public static void main(String[] args) { System.out.print("请输入数字:"); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); Test2 test2 = new Test2(); test2.m = n; test2.getBlackHoleNum(n); } public void getBlackHoleNum(int n) { List list = new ArrayList<>();//用于记录每次相减得到的数 int min = 0;//重排最大值 int max = 0;//重排最小值 Boolean over = true;//判断相减的数是否有循环,如果有循环就直接结束,否则一直进行下去 Boolean flag = true;//用于循环计算输入数的位数 int count = 0;//记录输入的数是多少位 int temp = n;//防止重排的n在计算的时候发生改变,就用一个变量temp来记录一下 int position = 0;//记录出现循环的位置 while (over) { count = 0; temp = n; while (flag) { temp = temp / 10; count++; if (temp == 0) { flag = false; } } max = getMax(n, count); min = getMin(n, count); n = max -min; //用循环依次比较list中是否有n存在,如果存在直接退出,打印黑洞数 for(int i=0;i<list.size();i++){ if(n==(int)list.get(i)){ position = i; over = false; break; } } if (over){ list.add(n); } flag = true; } System.out.print(m + "求出来的黑洞数为:" ); for(int i=position;i<list.size();i++){ System.out.print(list.get(i)+ " "); } } //获取最大的数 public int getMax(int n, int count) { int[] a = new int[count];//用数组将每一位存起来 for (int m = 0; m < count; m++) { a[m] = n - (n / 10) * 10; n = n / 10; } int c = count; int max = 0; int j = 0; //用冒泡排序 重排 while (c != 0) { for (int i = 0; i < c; i++) { j = i + 1; if (j != c) { if (a[i] > a[j]) { int k = a[i]; a[i] = a[j]; a[j] = k; } } } c--; } for (int m = 0; m < count; m++) { int p = m; while (p != 0) { a[m] = a[m]*10; p--; } max = max +a[m]; } return max; } //获取最小的数,类似获取最大数 public int getMin(int n, int count) { int[] a = new int[count]; for (int m = 0; m < count; m++) { a[m] = n - (n / 10)*10; n = n / 10; } int c = count; int min = 0; int j = 0; while (c != 0) { for (int i = 0; i < c; i++) { j = i + 1; if (j != c) { if (a[i] < a[j]) { int k = a[i]; a[i] = a[j]; a[j] = k; } } } c--; } for (int m = 0; m < count; m++) { int p =m; while (p != 0) { a[m] = a[m]*10; p--; } min = min +a[m]; } return min; } }值得注意的几个问题就是:
1.黑洞数可能是一个,也可能是一组数,所以我用的是list来存储求出来的黑洞数
2.这里面主要的问题就是一些细节要注意,比如注意变量的改变情况,不要出现死循环,如果大家不知道问题出在哪里,可以使用debug运行模式来执行,这样就知道在哪里出现问题,知道哪个点需要修改。
测试结果:
三位数的黑洞数都是495
四位数的黑洞数都是6174
五位数的黑洞数就是上面四个,可能就是顺序不一样。
大家可以进行测试,当然如一位数,两位数还有每一位都是一样的比如999,这个当然黑洞数是0。
相关文章推荐
- 蓝桥杯 黑洞数 解题报告
- 黑洞数算法
- 黑洞数
- Java计算黑洞数的方法示例
- Java语言基础【1】
- java web(二)
- Java散落知识点总结(一)
- JavaSE学习笔记之-----基础语法
- MyEclipse10修改Servlet和JSP模板
- 深入理解Java虚拟机-自动内存管理机制
- java web开发(一)
- java -- 低级失误
- 关于 Java 中 try、finally 语句块的分析
- 浅析Java中的反射机制原理
- java基础学习总结——数组
- 与Session的亲密接触&彻底掌握Java中Session Token Cookie
- Java ServerSocket 手动关闭监听
- java.lang.IllegalArgumentException: pointerIndex out of range(ViewPager与PhotoView联合使用)
- java基础学习总结——线程(一)
- java基础学习总结——线程(二)