黑马程序员技术交流社区

标题: 如何求由1234随即组合的四位数(无重复) [打印本页]

作者: 顾祯杰    时间: 2016-8-24 22:13
标题: 如何求由1234随即组合的四位数(无重复)
有四个数字 1,2,3,4,求 由他们组成的无重复四位数的具体数值和总个数  求大婶指教~
作者: 顾祯杰    时间: 2016-8-25 00:35
想了一晚上  终于想出来了~非喜勿喷哈
public class Qiu {
        public static void main(String[] args) {
                int sum=0;
                for (int i = 1233; i < 4400; i++) {
                        int a = i / 1000;
                        int b = i / 100 % 10;
                        int c = i /10 % 10;
                        int d = i % 10;
                       
                        if (a + b + c + d == 10 && a*b*c*d==24) {
                        System.out.println("" + a + b + c + d);
                        sum+=1;
                        }
                }
                System.out.println(sum);
        }
}
作者: cat73    时间: 2016-8-25 08:41
本帖最后由 cat73 于 2016-8-25 08:42 编辑

[Java] 纯文本查看 复制代码
public final class Main {
    public static void main(final String[] args) {
        Main.traverse(ArrayUtil.box("1234".toCharArray()), 0, chars -> Log.debug(new String(ArrayUtil.unBox(chars), 1, 3)));
    }

    /**
     * 遍历几个元素的所有可能的组合
     *
     * @param array 元素列表
     * @param index 请传 0
     * @param out 结果输出的接口
     */
    public static <T> void traverse(final T[] array, final int index, final TraverseOut<T> out) {
        if (index == array.length - 1) {
            out.invoke(array);
        } else {
            for (int index2 = index; index2 < array.length; index2++) {
                ArrayUtil.swap(array, index, index2);
                Main.traverse(array, index + 1, out);
                ArrayUtil.swap(array, index, index2);
            }
        }
    }

    /**
     * 遍历结果输出的接口
     *
     * @author cat73
     */
    @FunctionalInterface
    public static interface TraverseOut<T> {
        void invoke(T[] t);
    }
}


  1. [00:00:00] [DEBUG]: 1234
  2. [00:00:00] [DEBUG]: 1243
  3. [00:00:00] [DEBUG]: 1324
  4. [00:00:00] [DEBUG]: 1342
  5. [00:00:00] [DEBUG]: 1432
  6. [00:00:00] [DEBUG]: 1423
  7. [00:00:00] [DEBUG]: 2134
  8. [00:00:00] [DEBUG]: 2143
  9. [00:00:00] [DEBUG]: 2314
  10. [00:00:00] [DEBUG]: 2341
  11. [00:00:00] [DEBUG]: 2431
  12. [00:00:00] [DEBUG]: 2413
  13. [00:00:00] [DEBUG]: 3214
  14. [00:00:00] [DEBUG]: 3241
  15. [00:00:00] [DEBUG]: 3124
  16. [00:00:00] [DEBUG]: 3142
  17. [00:00:00] [DEBUG]: 3412
  18. [00:00:00] [DEBUG]: 3421
  19. [00:00:00] [DEBUG]: 4231
  20. [00:00:00] [DEBUG]: 4213
  21. [00:00:00] [DEBUG]: 4321
  22. [00:00:00] [DEBUG]: 4312
  23. [00:00:00] [DEBUG]: 4132
  24. [00:00:00] [DEBUG]: 4123
复制代码


作者: 悠悠呦呦    时间: 2016-8-25 09:07
能组合到只用一个for循环吗
作者: 顾祯杰    时间: 2016-8-27 00:18
悠悠呦呦 发表于 2016-8-25 09:07
能组合到只用一个for循环吗

是啊   他们说用一个循环做出来的才是老司机
作者: gohw007    时间: 2016-8-27 00:24
public static void main(String[] args) {                   int shu = 0;                 int count = 0;                 String s;                 for (int a = 1; a <= 4; a++)                 {                  for (int b = 1; b <= 4; b++)                  {                    for (int c = 1; c <= 4; c++)                    {                       for (int d = 1; d <= 4; d++)                   {                     // 打印出所有不重复的数字             if (a != b && a != c && a != d && b != c && b != d && c != d)                 {                     shu = a * 1000 + b * 100+ c * 10+ d;                     s = String.valueOf(shu);//将int类型的数转换成字符串                     // 4不能再第1位, "1"与"3"不能挨着  indexof是表示此数第一次出现的位置                if (s.indexOf("4") != 0&& s.indexOf("13") == -1 && s.indexOf("31") == -1)            {                      count++;              System.out.println(s);                }              }           }         }   }
作者: 水月灬清影    时间: 2016-8-30 21:19
本帖最后由 水月灬清影 于 2016-8-30 21:26 编辑

[Java] 纯文本查看 复制代码
import java.util.Arrays;
public class Demo {
        public static void main(String[] args) {
                int count = 0;
                for (int i = 1234; i <= 4321; i++) {
                        char[] num = Integer.toString(i).toCharArray();
                        Arrays.sort(num);
                        if (String.valueOf(num).equals("1234")) {
                                System.out.println(i);
                                count++;
                        }
                }
                System.out.println("总计:" + count);
        }
}


作者: 顾祯杰    时间: 2016-8-30 21:45
gohw007 发表于 2016-8-27 00:24
public static void main(String[] args) {                   int shu = 0;                 int count = 0;                 String s; ...

谢谢大神帮忙
作者: wq1194165366    时间: 2016-8-30 23:18
[AppleScript] 纯文本查看 复制代码
public class Demo59 {

        /**
         * 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
         * 思路:
         * 123,124,132,134,142,143---->1*2*3*4=24
         * a*100+b*10+c--->三重循环
         *
         */
        public static void main(String[] args) {
                int count=0;
                for(int i = 1;i<5;i++){
                        for(int j=1;j<5;j++){
                                for(int k=1;k<5;k++){
                                        if(i!=k && k!=j && j!=i){
                                                System.out.print(i*100+j*10+k+"\t");
                                                count++;
                                                if(count%6==0){
                                                        System.out.println();
                                                }
                                                       
                                        }
                                }
                        }
                }
                System.out.println("能组成"+count+"个不重复且互不相同的三位数");
        }

}

作者: 顾祯杰    时间: 2016-9-2 21:09
有人可以一个循环解决么??
作者: 梦想的小草    时间: 2016-9-2 21:56
应该不是很难,楼上的大神们都写了,我就不多于了,哈哈
作者: 顾祯杰    时间: 2016-9-9 21:54
梦想的小草 发表于 2016-9-2 21:56
应该不是很难,楼上的大神们都写了,我就不多于了,哈哈

  好吧
作者: 13411939415    时间: 2016-9-10 21:46
送你一个递归算法,可以是任意字符,任意字符个数

public static void main(String[] args) {
        char[] arr = {'1','2','3','4'};
        pailie(arr,0);
}

public static void swap(char[] arr,int i,int j) {
        char c = arr[i];
        arr[i] = arr[j];
        arr[j] = c;
}

public static void pailie(char[] arr,int index) {
        if(index >= arr.length) {
                System.out.println(arr);
                return;
        }
       
        for(int i = index; i < arr.length; i++) {
                swap(arr,i,index);
                pailie(arr,index + 1);
                swap(arr,i,index);
        }
}




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