路漫漫路漫漫 2020-04-02 17:25 采纳率: 66.7%
浏览 140
已采纳

满足下面这种需求的java算法有哪位大牛会么?

一个总数,拆分成n个数,拆分的这几个数总和等于这个总数,并且每个数有最大和最
小限制,限制区间可以为正负数.

例如:总数等于1000 , 拆分成 10个数 , 每个数的范围区间在 -10到200.

且随机拆成的10个数累加等于1000.

  • 写回答

2条回答 默认 最新

  • renkai721 2020-04-03 10:21
    关注

    以下是参考代码

    package test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test {
        // 保存生成的随机数
        private static List<Integer> resultList = new ArrayList<Integer>();
        public static void main(String[] args) {
            // 总数
            int number = 10;
            // 最大限制
            int max = 10;
            // 最小限制
            int min = -2;
            // 拆分成个数
            int area = 4;
            // 按照规则拆分数字
            // 注意:数字越大,计算的时间越长
            mySplitNumber(number,max,min,area);
        }
    
        /**
         * 按照规则拆分数字
         * @author: renkai721
         * @date: 2020年4月3日 上午9:56:17
         * @Title: mySplitNumber 
         * @Description: 
         * @param number
         * @param max
         * @param min
         * @param area
         *
         */
        private static void mySplitNumber(int number, int max, int min, int area) {
            // 按照最大最小生成随机数
            boolean isRunning = true;
            int index = 0;
            while (isRunning) {
                index+=1;
                System.out.println("计算次数="+index);
                // 计算中
                int runningCount = myCreateRandom(max, min, area);
                if(number == runningCount) {
                    // 如果计算的数字相加等于总数就不计算了,否则就一直计算
                    isRunning = false;
                    System.out.println("题目:总数="+number+", 最大限制="+max+", 最小限制="+min+", 拆分成="+area+"个数");
                    System.out.print("结果:总数="+runningCount+", 生成的随机数=[");
                    for (int i = 0; i < resultList.size(); i++) {
                        System.out.print(resultList.get(i)+",");
                    }
                    System.out.print("]");
                }
            }
    
        }
        /**
         * 按照规则生成随机数
         * @author: renkai721
         * @date: 2020年4月3日 上午9:55:59
         * @Title: myCreateRandom 
         * @Description: 
         * @param max
         * @param min
         * @param area
         * @return
         *
         */
        private static int myCreateRandom(int max, int min, int area) {
            resultList = null;
            resultList = new ArrayList<Integer>();
            int tempCount = 0;
            for(int i=0;i<area;i++) {
                // 注意,随机数规则不包含max和min两个数,如果需要包含把max+1,min-1即可
                int random = (int) (Math.random()*(max-min)+min);
                resultList.add(random);
                tempCount += random;
            }
            return tempCount;
        }
    }
    
    
    
    
    

    以下是输出结果

    
    计算次数=1
    计算次数=2
    计算次数=3
    计算次数=4
    计算次数=5
    计算次数=6
    计算次数=7
    计算次数=8
    计算次数=9
    计算次数=10
    计算次数=11
    计算次数=12
    计算次数=13
    计算次数=14
    计算次数=15
    计算次数=16
    计算次数=17
    计算次数=18
    计算次数=19
    题目:总数=10, 最大限制=10, 最小限制=-2, 拆分成=4个数
    结果:总数=10, 生成的随机数=[1,2,8,-1,]
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试