lishuiye 2010-12-22 15:09
浏览 1500
已采纳

1-9自然数,可以组成3个3位数(数字不能重复使用),要求这三个三位数满足1:2:3,

1-9自然数,可以组成3个3位数(数字不能重复使用),要求这三个三位数满足1:2:3,
写出实现逻辑和程序。
求代码!

  • 写回答

7条回答 默认 最新

  • dyccsxg 2010-12-22 18:00
    关注

    这个有点意思
    [code="java"] private static TreeSet set = new TreeSet();
    /**
    * @param args
    */
    public static void main(String[] args) throws Exception {

        int[] data = new int[]{1,2,3,4,5,6,7,8,9};
        int[] used = new int[3];
        for (int i=0; i<used.length; i++){
            // 用 -1 来表示未使用
            used[i] = -1;
        }
        // 计算排列数
        calcPermutation(data, used, 0, 3);
        // 
        int second = 0;
        int third = 0;
        for (Integer first : set){
            second = first * 2;
            third = first * 3;
            if (set.contains(second) && set.contains(third)){
                // 检查是否有重复数字
                if (isUnique(first, second, third)){
                    System.out.println(first + ", " + second + ", " + third);
                }
            }
        }
    
    }
    /**
     * 计算排列数
     * @param data 原始数组
     * @param used 存储一组解的下标
     * @param level 当前层次 [0, deep]
     * @param deep 排列深度 [level, min(used.length, data.length)]
     */
    public static void calcPermutation(int[] data, int[] used,
            int level, int deep){
        if (level == deep){
            // 完成一组解
            output(data, used);
            return;
        }
        // 计算当前层的下一个可用值
        int next = getNext(used, level, data.length);
        while (next != -1){
            // 为当前层赋值
            used[level] = next;
            // 处理下一层
            calcPermutation(data, used, level + 1, deep);
            // 回溯时将下一层还原
            if (level + 1 < used.length){
                used[level + 1] = -1;
            }
            next = getNext(used, level, data.length);
        }
    }
    /**
     * 获取下一个未使用的值
     * @param used 存储一组解的下标
     * @param level 当前层次 [0, used.length)
     * @param length 
     * @return
     */
    private static int getNext(int[] used, int level, int length) {
        int result = -1;
        for (int i=used[level] + 1; i<length; i++){
            // 标记当前下标是否已经使用过
            boolean available = true;
            for (int j=0; j<=level; j++){
                if (i == used[j]){
                    available = false;
                    break;
                }
            }
            if (available){
                result = i;
                break;
            }
        }
        return result;
    }
    /**
     * 输出一组解
     * @param data
     * @param used
     */
    private static void output(int[] data, int[] used) {
        int result = 0;
        for (byte i=0; i<used.length; i++){
            result = result * 10 + data[used[i]];
        }
        set.add(result);
    }
    /**
     * 判断数字是否唯一
     * @param args
     * @return
     */
    private static boolean isUnique(int... args){
        Set<Integer> tmp = new HashSet<Integer>();
        for (int arg : args){
            int first = arg / 100;
            arg = arg%100;
            int second = arg / 10;
            int third = arg%10;
            if (tmp.contains(first) || tmp.contains(second) 
                    || tmp.contains(third)){
                return false;
            }
            tmp.add(first);
            tmp.add(second);
            tmp.add(third);
        }
        return true;
    }[/code]
    

    // 输出
    [code="html"]192, 384, 576
    219, 438, 657
    273, 546, 819
    327, 654, 981[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘