黑马程序员技术交流社区

标题: java的一个问题怎么做 [打印本页]

作者: 丶小天    时间: 2014-2-20 11:49
标题: java的一个问题怎么做
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。

请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。

这题怎么做?
作者: 漩涡java    时间: 2014-2-20 16:20
来和你增加人气!
作者: 57684621    时间: 2014-2-20 17:17

  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.List;

  4. /*
  5. 关注微信有你想不到的惊喜任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:
  6. 65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。
  7. 如此往复,数字会落入某个循环圈(称为数字黑洞)。
  8. 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。

  9. 请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
  10. [82962, 75933, 63954, 61974]
  11. 其中数字的先后顺序可以不考虑。
  12. *
  13. * 思路:       
  14. *                 1.把5个数字转换为长度为5的数组。
  15. *                 2.每个索引中的值都为0-9。
  16. *                 3.升序和降序排列。
  17. *                 4.将数组转换为字符串输出,然后将字符串转换为数字进行运算
  18. *                 5.对得到的数字进行递归运算,如果5位数全部相同,则停止循环。
  19. *                 6.将得到的数字装到list中。
  20. * */

  21. public class DigitDarkHoleDemo {
  22.         public static void main(String[] args) {
  23.                 int x = 34256;
  24.                 digitHole(x);
  25.         }
  26.         /*利用递归调用,每次获取到的数字,都跟集合中已经存在的数字相比较,若想等则说明找到该循环*/
  27.         public static void digitHole(int x){
  28.                 int temp = getNum(x);
  29.                 List<Integer> list = new ArrayList<>(10);
  30.                 boolean flag = true;
  31.                 while(flag){
  32.                         list.add(temp);
  33.                         temp=getNum(temp);
  34.                         for(int i=0;i<list.size();i++){
  35.                                 if(temp == list.get(i)){
  36.                                         int index = list.indexOf(temp);
  37.                                         while(index>0){
  38.                                                 try {
  39.                                                         list.remove(0);
  40.                                                         index--;
  41.                                                 }catch (Exception e) {
  42.                                                         e.printStackTrace();
  43.                                                 }
  44.                                         }
  45.                                         flag=false;
  46.                                         break;
  47.                                 }
  48.                         }
  49.                 }
  50.                 System.out.println(list);
  51.         }
  52.         @Override       
  53.         public String toString() {//用集合来装数字黑洞中的循环圈
  54.                 String str="[";
  55.                 List<Integer> list = new ArrayList<>();
  56.                 for(int i=0;i<list.size();i++){
  57.                         if(i==list.size()-1){
  58.                                 str+=list.indexOf(i);
  59.                         }else{
  60.                                 str+=list.indexOf(i)+",";
  61.                         }
  62.                 }
  63.                 return str+"]";
  64.         }
  65.        
  66.         public static int getNum(int num){//获得一个5位数的数字黑洞
  67.                 int[] arr = new int[5];
  68.                 int[] temparr = getArr(num);
  69.                 if(temparr.length<5){
  70.                         for(int i=0;i<5-temparr.length;i++){
  71.                                 arr[i] = 0;
  72.                         }
  73.                 }
  74.                 System.arraycopy(temparr, 0, arr, arr.length-temparr.length, temparr.length);
  75.                 Arrays.sort(arr);
  76.                 int min = arr2Num(arr);//得到这个数字升序排列后的数字
  77.                 invert(arr);
  78.                 int max = arr2Num(arr);
  79.                 int temp = max-min;//得到最大值减去最小值的差,得到新的数据
  80.                 return temp;
  81.                
  82.         }
  83.        
  84.         public static int[] getArr(int x){//将得到的数变成一个数组,好进行升序与降序排列
  85.                 String str = x+"";
  86.                 char[] carr = str.toCharArray();
  87.                 int[] arr = new int[carr.length];
  88.                 for(int i=0;i<carr.length;i++){
  89.                         arr[i] = Character.getNumericValue(carr[i]);
  90.                 }
  91.                 return arr;
  92.         }
  93.        
  94.         public static int arr2Num(int[] arr){//将数组变成数字
  95.                 String str = "";
  96.                 for(int i=0;i<arr.length;i++){
  97.                         str+=arr[i];
  98.                 }
  99.                 return Integer.parseInt(str);
  100.         }
  101.        
  102.         public static void invert(int[] arr){//反转数组,用于将数组逆序排列
  103.                 int temp = 0;
  104.                 for(int i=0;i<arr.length/2;i++){
  105.                         temp = arr[arr.length-1-i];
  106.                         arr[arr.length-1-i] = arr[i];
  107.                         arr[i] = temp;
  108.                 }
  109.         }       
  110.        
  111. }
复制代码

作者: 皓栎    时间: 2014-2-20 21:40
  1. package day4;

  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。
  6. * 求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
  7. * 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
  8. * 请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。
  9. * 循环圈的输出格式仿照:[82962, 75933, 63954, 61974]
  10. * 其中数字的先后顺序可以不考虑。
  11. * @author Administrator
  12. */
  13. public class DigitalBlackHole {

  14.         public static void main(String[] args) {
  15.                
  16.                 int num = 34258;
  17.                 print(num);
  18.         }
  19.        
  20.         //把循环圈内的数字提取出来,并规范成具有一定格式的字符串
  21.         private static void print(int num){
  22.                
  23.                 //直到第一次出现重复元素才终止循环,并装入集合中(包含第一次出现的重复元素)
  24.                 ArrayList<Integer> list = new ArrayList<Integer>();
  25.                 int ret = getSub(num);
  26.                 while(ret != 0){
  27.                         ret = getSub(ret);
  28.                         if(list.contains(ret)){
  29.                                 list.add(ret);
  30.                                 break;
  31.                         }else{
  32.                                 list.add(ret);
  33.                         }
  34.                 }
  35.                
  36.                 //用来装循环圈内的数字
  37.                 List<Integer> subList = new ArrayList<Integer>();
  38.                 for(int i = 0; i < list.size(); i++){
  39.                         if(list.get(i).equals(list.get(list.size() - 1))){
  40.                                 subList = list.subList(i, list.size() - 1);
  41.                                 break;
  42.                         }
  43.                 }
  44.                
  45.                 //把集合内数字转换成字符串
  46.                 String str = "[";
  47.                 for(int i = 0; i < subList.size(); i++){
  48.                         str += subList.get(i);
  49.                         if(i != subList.size() - 1){
  50.                                 str += ",";
  51.                         }
  52.                 }
  53.                 str += "]";
  54.                 System.out.println(str);
  55.         }
  56.        
  57.         //求最大数与最小数之差
  58.         private static int getSub(int num){
  59.                
  60.                 StringBuilder sb = new StringBuilder("");
  61.                 sb.append(num);
  62.                
  63.                 char[] ch = sb.toString().toCharArray();
  64.                 if(ch.length != 5){
  65.                         for(int i = 0; i < 5 - ch.length; i++){
  66.                                 sb.append(0);
  67.                         }
  68.                 }
  69.                 ch = sb.toString().toCharArray();
  70.                
  71.                 int subtract = descending(ch) - ascending(ch);
  72.                
  73.                 return subtract;
  74.         }
  75.        
  76.         //数组元素升序排序(冒泡),并转换成int整数
  77.         private static int ascending(char[] arr){
  78.                 int min = 0;
  79.                 String str = "";
  80.                 for(int i = 0; i < arr.length - 1; i++){
  81.                         for(int j = 0; j < arr.length - 1 - i; j++){
  82.                                 if(arr[j] > arr[j + 1]){
  83.                                         char temp = arr[j];
  84.                                         arr[j] = arr[j + 1];
  85.                                         arr[j + 1] = temp;
  86.                                 }
  87.                         }
  88.                 }
  89.                 for (char c : arr) {
  90.                         str += c;
  91.                 }
  92.                 min = new Integer(str);
  93.                 return min;
  94.         }
  95.        
  96.         //数组元素降序排序(选择),并转换成int整数
  97.         private static int descending(char[] arr){
  98.                 int max = 0;
  99.                 String str = "";
  100.                 for(int i = 0; i < arr.length - 1; i++){
  101.                         for(int j = i; j < arr.length - 1; j++){
  102.                                 if(arr[i] < arr[j + 1]){
  103.                                         char temp = arr[i];
  104.                                         arr[i] = arr[j + 1];
  105.                                         arr[j + 1] = temp;
  106.                                 }
  107.                         }
  108.                 }
  109.                 for (char c : arr) {
  110.                         str += c;
  111.                 }
  112.                 max = new Integer(str);
  113.                 return max;
  114.         }
  115. }
复制代码


排序方法好久没写了,就自己写了下升序和降序的方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2