组合计算——拆分一个整数数为N个

本文介绍了两种方法将一个整数Number拆分为N个介于(min, max)之间的数。方法一采用循环加随机的方式,方法二利用预处理数组和循环更新最小值。关键在于找到合适的最大值和最小值,并确保所有拆分后的数之和等于原始数。" 114362452,10094529,C# WinForm获取运行目录技巧,"['C#编程', 'WinForm开发', '文件路径处理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将一个数Number按照拆分成N个在(min, max)范围内的数

方法一

        基本思想:循环1 ~ N,每次循环,都计算随机范围(min , max),判断是否可以生成N个满足要求的数

<?php

/**
 * 将一个数按照拆分成N个在(min, max)范围内的数
 * @param  [type] $number 待拆分的数
 * @param  [type] $count  拆分的数字的个数
 * @param  [type] $min    拆分的数字的最小值
 * @param  [type] $max    拆分的数字的最大值
 * @return [type]         返回list
 */
function splitOneNumberToMultiNumber($number, $count, $min, $max){
    $list = [];
    $total_last = $number;
    for ($i=1; $i <= $count ; $i++) { 
        $_min = $total_last - ($count - $i) * $max;
        $_max = $total_last - ($count - $i) * $min;
        $min  = $_min >= $min ? $_min: $min;
        $max  = $_max >= $max ? $max: $_max;
        if($i == $count){
            $list[$i] = $total_last;
        } else {
            $list[$i] = rand($min , $max);
        }
        $total_last = $total_last - $list[$i];    
    }
    return $list;
}

$list = splitOneNumberToMultiNumberPre(1000, 5 ,100, 300);
echo implode(',', $list);

方法二

基本思想:用最小值进行预处理,生成预处理数组,长度为N,每个key对应的值为最小值min,重置(min,max),然后循环:1 ~ N,每次循环都需重置(min,max), 终止条件为:i == N,或者total_last为0;

<?php

/**
 * 将一个数按照拆分成N个在(min, max)范围内的数
 * @param  [type] $number 待拆分的数
 * @param  [type] $count  拆分的数字的个数
 * @param  [type] $min    拆分的数字的最小值
 * @param  [type] $max    拆分的数字的最大值
 * @return [type]         返回[]
 */
function splitOneNumberToMultiNumberPre($number, $count, $min, $max){
    $list = [];
    for ($i=1; $i <= $count; $i++) { 
        $list[$i] = $min;
    }
    $total_last = $number - $count * $min;
    $max = $max - $min;
    $min = 0;    
    for ($i=1; $i <= $count ; $i++) { 
        $_min = $total_last - ($count - $i) * $max;
        $_max = $total_last - ($count - $i) * $min;
        $min  = $_min >= $min ? $_min: $min;
        $max  = $_max >= $max ? $max: $_max;
        if($i == $count){
            $rand = $total_last;
            $list[$i] += $rand;
        } else {
            $rand = rand($min , $max);
            $list[$i] += $rand;
        }    
        $total_last = $total_last - $rand;
        if($total_last == 0){
            break;
        }    
    }
    return $list;
}

$list = splitOneNumberToMultiNumberPre(1000, 5 ,100, 300);
echo implode(',', $list);

NOTE

将一个数Number按照拆分成N个数:没有限制的时候,自己生成初始的最大值:max(Number - (N - 1) * 1),而最小值min肯定为1,剩下的处理方式同上

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值