黑马程序员技术交流社区

标题: 各位大神,求解~~~ [打印本页]

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

请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
作者: 李白衣    时间: 2014-2-24 19:23
  1. package itheima.blog;

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

  5. public class NumberBlackhole {

  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 List<Integer> allNumber = new ArrayList<Integer>();
  9.                 List<Integer> repeatedNumber = new ArrayList<Integer>();
  10.                 int value = 99887;//指定一个数
  11.                 while(true){
  12.                        
  13.                         if(allNumber.contains(value)){
  14.                                 if(repeatedNumber.contains(value))
  15.                                         break;
  16.                                 else
  17.                                         repeatedNumber.add(value);
  18.                         }
  19.                         else{
  20.                                         allNumber.add(value);
  21.                         }
  22.                                
  23.                         value = nextNumber(toArray(value));
  24.                 }
  25.                 System.out.println(allNumber);
  26.                 /*打印循环圈*/
  27.                 System.out.println(repeatedNumber);
  28.         }


  29.              
  30.         public static int[] toArray(int n){
  31.                 int arr[]=new int[5];
  32.                 for(int i=0; i<5; i++){
  33.                         arr[4-i] = n%10;
  34.                         n = n/10;
  35.                 }
  36.             return arr;
  37.         }
  38.        
  39.         public static int nextNumber(int a[]){
  40.             Arrays.sort(a);
  41.             String min="";
  42.             for(int i=0;i<5;i++){
  43.                     min=min+String.valueOf(a[i]);
  44.             }
  45.             int Min=Integer.parseInt(min);
  46.             StringBuffer sb = new StringBuffer(min).reverse();
  47.             String max = sb.toString();
  48.             int Max = Integer.parseInt(max);
  49.             return Max-Min;
  50.         }

  51. }
复制代码

作者: syw02014    时间: 2014-2-24 19:42
你这是蓝桥杯(C本科组)的试题,之前参赛前做的练习题有它,直接你代码吧:
  1. #include <stdio.h>
  2. struct
  3. {
  4.   int num;
  5.   int next;
  6.   int node;
  7. }N[100000];

  8. void init()
  9. {
  10.   int i;
  11.   for(i=0; i<100000;i++)
  12.         {  
  13.           N[i].num=i;
  14.           N[i].next=-1;
  15.           N[i].node=-1;
  16.         }
  17. }

  18. int maxof(int m)
  19. {
  20.   int i, t = 0;
  21.   int d[10] = {0,0,0,0,0,0,0,0,0,0};
  22.   while (m > 0)
  23.   {
  24.     d[m%10]++;
  25.     m/=10;
  26.   }
  27.   for (i = 9; i >= 0; i --)
  28.     while (d[i] > 0)
  29.     {
  30.           t*= 10;
  31.           t += i;
  32.           d[i] --;
  33.          }  
  34.   return t;
  35. }

  36. int minof(int m)
  37. {
  38.   int i, t = 0;
  39.   int d[10] = {0,0,0,0,0,0,0,0,0,0};
  40.   while (m > 0)
  41.   {
  42.     d[m%10]++;
  43.     m/=10;
  44.   }
  45.   for (i = 0; i <= 9; i ++)
  46.     while (d[i] > 0)
  47.     {
  48.           t*= 10;
  49.           t += i;
  50.           d[i]--;
  51.         }  
  52.   return t;
  53. }

  54. int trans(int m)
  55. {
  56.   return (maxof(m)-minof(m));
  57. }

  58. int main()
  59. {
  60.    int i,t,k,j,count=0;
  61.    init();
  62.    for(i = 0;i<100000; i ++)
  63.      if(N[i].next== -1)  
  64.      {
  65.         k = i;
  66.         do        
  67.         {                              
  68.             N[k].next = trans(k); //下一个位置
  69.             N[k].node = i; //首先由i开始的链
  70.             k = trans(k);   
  71.          }while (N[k].next == -1);  //遇到已经处理的节点则结束
  72.         
  73.         
  74.          if (N[k].node== i)  //是首先由i起始的链才是首次发现的圈
  75.          {
  76.            t = k;
  77.            printf("%d: [%d", count++, t);

  78.            while (trans(k) != t)
  79.            {
  80.              k = trans(k);
  81.                          printf(", %d", k);
  82.              N[k].node = 1;      
  83.            }
  84.            printf("]\n");
  85.          }
  86.      }
  87. }
复制代码








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