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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© m6281838 中级黑马   /  2012-12-7 16:23  /  1695 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package count;
/*1,2,3,4,5组成的没有重复的5位数,且2和3不能在一起,5不能在千位,可以有多少种排列方式?全部打印出来*/
public class No_repeat2 {
        public static void main(String[]args){
                int count=0;
                int num=0;
                for(int a=1;a<5;a++){
                        for(int b=1;b<6;b++){
                                for(int c=1;c<6;c++){
                                        for(int d=1;d<6;d++){
                                                for(int e=1;e<6;e++){
                                                        if(a!=b&&a!=c&&a!=d&&a!=e
                                                                &&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e
                                                                        ){
                                                                count++;
                                                                                                                                if(((a==2||a==3)&&(b==2||b==3))||((c==2||c==3)&&(b==2||b==3))||
                                                                                ((c==2||c==3)&&(d==2||d==3))||((e==2||e==3)&&(d==2||d==3))){
                                                                        num++;
                                                                        System.out.println(a+""+b+""+c+""+d+""+e+" ");
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
                System.out.println("5不在千位,不重复的数有:"+count);
                System.out.println("5不在千位,2,3在一起的不重复的数有:"+num);
                System.out.println("5不在千位,2,3不在一起的不重复的数有:"+(count-num));
        }

}
问题1:我这个代码很冗长,希望有高手能写个简单的方法。
问题2:题目说的是要打印2和3不在一起的情况,但是我打印的是2和3在一起的情况,请问怎么解决呢?

评分

参与人数 1技术分 +1 收起 理由
崔政 + 1 淡定

查看全部评分

12 个回复

倒序浏览
貌似这个可以用正则表达式,轻松的完成············
回复 使用道具 举报
笨方法
  1. for (int i = 12345; i <= 54321; i++) {
  2.                         String str = String.valueOf(i);
  3.                         if (str.charAt(1) != '5' && str.indexOf("32") == -1
  4.                                         && str.indexOf("23") == -1 && str.indexOf('5') != -1
  5.                                         && str.indexOf('4') != -1 && str.indexOf('3') != -1
  6.                                         && str.indexOf('2') != -1 && str.indexOf('1') != -1) {
  7.                                 System.out.println(str);
  8.                         }
  9.                 }
复制代码
楼上说正则表达式,我觉得应该行,就是我的正则表达式还没学好,不会写,唉,悲剧,我去学习一下

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 新立 于 2012-12-8 11:19 编辑

点了一次提交没反应,有点了一次,结果就出来两个
回复 使用道具 举报
新立 发表于 2012-12-8 11:18
点了一次提交没反应,有点了一次,结果就出来两个

为什么你的方法算出来是56个,我上面的方法的算出来是60个 ?
回复 使用道具 举报
本帖最后由 xjandrew 于 2012-12-8 14:35 编辑

我编的也不简练
import java.util.*;



public class No_repeat3
{
        public static void main(String[] args)throws NoSuchElementException
        {
                String str2 = "[1-5][1-4][1-5]{3}";//5不在千位
                ArrayList<String> al = new ArrayList<String>();
                ArrayList<String> alist = new ArrayList<String>();
                ArrayList<String> al3 = null;
            for (int i = 1; i <= 5; i++)
            {
               al.add(""+i);
            }
            
            Collections.sort(al);
            
            System.out.println(al);
            int max = 0;
            while(true)
            {
                    sop(jiaohuan(al));//1-5的数字随机交换
                    alist.add(jiaohuan(al));//将所有随机数存入alist中
                    al3 = singleElement(alist);//将alist中元素唯一化并存入al3
                    sop(singleElement(alist).size());//最大重复数
                    
                    if(singleElement(alist).size()==120)
                            break;
                    
            }
            int count = 1;
            for(String s : al3 )//按条件遍历
           {
                    if(s.matches(str2)
                                    && s.indexOf("32") == -1
                                    && s.indexOf("23") == -1
                                    )//2和3不在一起,5不在千位
                            sop(s+" count:"+count++);
            }
            
        }

        private static void sop(Object str) {
               
                System.out.println(str);
        }
        //1-5的数字随机交换
        private static String jiaohuan(ArrayList<String> al)
        {
                Collections.shuffle(al);
                String[] arr = al.toArray(new String[al.size()]);
            
            StringBuffer sb = new StringBuffer();
            for(int i = 0; i < arr.length; i++)
            {
                    sb. append(arr);
            }
            return sb.toString();
               
        }
        //将随机数唯一化封装为一个ArrayList
        public static ArrayList<String> singleElement(ArrayList<String> al)
        {
                        ArrayList<String> newAl = new ArrayList<String>();
                        
                        Iterator<String> it = al.iterator();
                        
                        while(it.hasNext())         
                        {
                                        String obj = it.next();
                                        if(!newAl.contains(obj))        
                                                        newAl.add(obj);
                                                        
                        }
                        return newAl;
        }
}

结果是56
最大重复数那里必须得自己确认,要不不会停
还请其他朋友优化

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
xjandrew 发表于 2012-12-8 14:29
我编的也不简练
import java.util.*;

额 ....直接看不懂啊~~~
为什么我的那个代码算出来是60?错在哪了 ?
回复 使用道具 举报
新立 中级黑马 2012-12-8 23:52:41
8#
m6281838 发表于 2012-12-8 13:16
为什么你的方法算出来是56个,我上面的方法的算出来是60个 ?

结果贴出来看看,
回复 使用道具 举报
数学上的组合计算法
  1. public class Zuhe2
  2. {  
  3.         public static void main(String[] args)
  4.         {  
  5.                 String s = "12345";
  6.                 //这里是要用到的所有数组成的一个字符串,其它字符同样适用  
  7.                 char[] c = s.toCharArray();  
  8.                 zuhe(c,c.length,0);  
  9.                 System.out.println("可能的组合数:"+kk);
  10.         }
  11.         static int kk=0;
  12.         private static void zuhe(char[] array, int n, int k)
  13.         {  
  14.                 if (n == k)
  15.                 {   
  16.                         if(array[1]!='5')
  17.                         {
  18.                                 //5不在千位上   
  19.                                 String str = new String(array);   
  20.                                 if(str.indexOf("23")<0&&str.indexOf("32")<0)
  21.                                 {
  22.                                         //2,3不能连续出现     
  23.                                         System.out.println(str);     
  24.                                         ++kk;   
  25.                                 }   
  26.                         }  
  27.                 }
  28.                 else
  29.                 {   
  30.                         for (int i = k; i < n; i++)
  31.                         {   
  32.                                 swap(array, k, i);   
  33.                                 zuhe(array, n, k + 1);   
  34.                                 swap(array, i, k);   
  35.                         }  
  36.                 }
  37.         }
  38.         private static void swap(char[] a, int n, int k)
  39.         {  
  40.                 char temp = a[n];  
  41.                 a[n] = a[k];  
  42.                 a[k] = temp;
  43.         }
  44. }
复制代码
老实说,组合算法我也看不懂

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
新立 发表于 2012-12-8 11:17
笨方法楼上说正则表达式,我觉得应该行,就是我的正则表达式还没学好,不会写,唉,悲剧,我去学习一下 ...

好好地研究了你写的这个方法,发现你有个地方写错了,运行出来的数字里面,不合题意。错误的地方是str.charAt(1) != '5' ,应该写成str.charAt(0) != '5',这样子算出来的答案是60。
回复 使用道具 举报
新立 发表于 2012-12-8 11:17
笨方法楼上说正则表达式,我觉得应该行,就是我的正则表达式还没学好,不会写,唉,悲剧,我去学习一下 ...

额 ...不好意思,我看错了。你的是对的!!
回复 使用道具 举报
新立 中级黑马 2012-12-11 23:11:22
12#
xjandrew 发表于 2012-12-9 15:26
数学上的组合计算法老实说,组合算法我也看不懂

数学真强大,百度一下去,什么叫组合算法
回复 使用道具 举报
新立 发表于 2012-12-11 23:11
数学真强大,百度一下去,什么叫组合算法

高中数学学的,我当时就没完全懂,所以用来实现的代码我看得也头疼。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马