A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄方 中级黑马   /  2012-2-27 15:10  /  1540 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,
得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。
如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。
其中5位数全都相同则循环圈为 [0],这个可以不考虑。
循环圈的输出格式仿照:[82962, 75933, 63954, 61974]其中数字的先后顺序可以不考虑。

3 个回复

倒序浏览
真难,没看懂什么意思
回复 使用道具 举报
  1. package my.test4;

  2. import java.util.ArrayList;

  3. public class Test2 {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 for(int i=10000;i<100000;i++)
  10.                 {
  11.                     ArrayList list=new ArrayList();
  12.                      int con=0;
  13.                                      int dif=getDif(i);
  14.                      while(dif!=i)
  15.                     {
  16.                             if(list.contains(dif))
  17.                                     break;//list中存在则跳出
  18.                             else
  19.                                     list.add(dif);
  20.                             dif=getDif(dif);                           
  21.                     }                    
  22.                     if(dif==i)
  23.                     {
  24.                             for(int c=0;c<list.size();c++)
  25.                                     System.out.print(list.get(c)+"|");
  26.                                                 System.out.print(dif);
  27.                             System.out.println();
  28.                     }
  29.                        
  30.                 }
  31.                
  32.                
  33.                
  34.         }
  35.         static int getDif(int original)
  36.         {//得到最大值与最小值之差
  37.                 int dif=0;
  38.                 dif=getMax(original)-getMin(original);
  39.                 return dif;
  40.         }
  41.         static int getMax(int original){//得到最大值
  42.                 int max=0;
  43.                 int p=0;
  44.                 char mod;
  45.                 char[] trs=(original+"").toCharArray();
  46.                 for(int i=0;i<trs.length-1;i++)
  47.                 {
  48.                         p=i;
  49.                         for(int k=i+1;k<trs.length;k++)
  50.                         {
  51.                                 if(trs[k]>trs[p])
  52.                                         p=k;
  53.                         }
  54.                         if(p!=i)
  55.                         {
  56.                                 mod=trs[p];
  57.                                 trs[p]=trs[i];
  58.                                 trs[i]=mod;
  59.                         }
  60.                 }
  61.                 String str=new String(trs);
  62.                 max=Integer.parseInt(str);
  63.                 return max;
  64.         }
  65.         static int getMin(int original){//得到最小值
  66.                 int min=0;
  67.                 int p=0;
  68.                 char mod;
  69.                 char[] trs=(original+"").toCharArray();
  70.                 for(int i=0;i<trs.length-1;i++)
  71.                 {
  72.                         p=i;
  73.                         for(int k=i+1;k<trs.length;k++)
  74.                         {
  75.                                 if(trs[k]<trs[p])
  76.                                         p=k;
  77.                         }
  78.                         if(p!=i)
  79.                         {
  80.                                 mod=trs[p];
  81.                                 trs[p]=trs[i];
  82.                                 trs[i]=mod;
  83.                         }
  84.                 }
  85.                 String str=new String(trs);
  86.                 min=Integer.parseInt(str);
  87.                 return min;
  88.         }

  89. }
复制代码

返回结果为:
59994|53955
53955|59994
82962|75933|63954|61974
71973|83952|74943|62964
61974|82962|75933|63954
83952|74943|62964|71973
62964|71973|83952|74943
63954|61974|82962|75933
75933|63954|61974|82962
74943|62964|71973|83952
并且测试了最大循环次数为9次,说明 5位数中
最多循环9此便能得到它本身或者(与它本身运算得到的值相等)

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 淡定

查看全部评分

回复 使用道具 举报
public class SortText
{
        public static void main(String[] args)
        {
                for(int i=10000;i<100000;i++){
                        Integer ceshi=(Integer)i;
                demo(ceshi.toString());
                }       
                List<String> list=new ArrayList<String>();
                for(String st1:set){
                        list.add(st1);
                }
                System.out.println(list+"这些数都是能构成数字黑洞的循环数"+"+发现一个规律:10000--100000之间的5位数正反两次循环排序差"都是这个集合里面的数");                               
        }
        public static void demo(String str1)
        {
                String a=str1;               
                Integer v=sortText(a,4);               
                String str4=sb2.toString();       
                 v=sortText(a,5);
                 String v1=v.toString();               
                if(str4.contains(v1)&&sb2.length()>30){       
                        sortText(a,4);
                        String hj=sb2.substring(6, 11);
                        set.add(hj);               
                }
        }               
        static HashSet<String> set=new HashSet<String>();
        static StringBuilder sb2=new StringBuilder();
        static StringBuilder sb1=new StringBuilder();
        static int j=0;       
        public static int sortText(String str,int a){
                if(a==4|a==5){sb2.delete(0, sb2.length());sb2.append(str+",");}
                for(int i=0;i<a;i++){
                        char[] ch=str.toCharArray();
                  if(ch.length ==5){
                        Arrays.sort(ch);
                        sb1.append(ch);
                        String min=sb1.toString();
                        String max=sb1.reverse().toString();
                        sb1.delete(0, sb1.length());
                        Integer distance=(Integer)(Integer.parseInt(max)-Integer.parseInt(min));
                        j=distance;
                        String dis=distance.toString();
                        str=dis;
                        if(dis.toCharArray().length==5){
                        sb2.append(j+",")                ;}
                  }               
                }
                return j;
        }               
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马