php算法求出一个数可以被分解成多少个_用php解决一个小算法,求思路。

谢邀!

对随机的五位数排序,最小在前最大在后的依次增大

前4次是随机值

第5次是总数减去前四次随机值

重要的就是前四次随机值的范围,就是其中的最小值和最大值。这时候如果最小值和最大值限制越多到后面越容易产生随机值,并且要保证最小值要大于前一个随机值的100以上。而关于最大值就简单多了,尽可能小,但是不会比最小值小。并且不会比我下面例子中使用的最大值( $rand_max )大。(至于为什么你可以思考下)

如果产生的随机值中差值产生重复,那么就重新产生随机值

$sum = 10000;

$diff = 100;

$count = 5;

$return = array();

$min = 0;

$i = 1;

while($i < $count) {

// 随机数不符合要求时的结果初始化

if(isset($return[$i]) || isset($return[$i+1])) {

unset($return[$i]);

unset($return[$i+1]);

}

// 剩余数

$remain_sum = $sum - array_sum($return);

// 剩余需要随机的个数

$remain_count = intval($count - count($return));

// 高斯求最小差值和,分两部分:S = n(n+1)(2n+4)/12 + $diff * ((n-1)(n-2)/2)

$min_diff = $remain_count * ($remain_count - 1) * (2 * ($remain_count - 1) + 4) / 12 + ($remain_count * ($remain_count - 1) / 2) * $diff;

// 随机范围的最小值

$min = $i == 1 ? 1 : $return[$i-1] + $diff + 1;

// 在范围内获取随机数

mt_srand((double)microtime() * 1000000);

// 随机范围的最大值

$rand_max = intval(($remain_sum - $min_diff) / $remain_count);

// 产生随机数

$min = mt_rand($min, $rand_max);

// 放入返回的数组

$return[$i] = $min;

if($i == $count - 1) {

// 最后一个随机数直接取总数减去前面的随机数

$return[$i+1] = $remain_sum - $min;

}

if(check_diff($return) === false) {

$i--;

continue;

}

$i++;

}

var_dump($return);die;

// 判断数组内是否有差值相等

function check_diff($arr) {

if(empty($arr)) {

return false;

}

$arr = array_map('intval', $arr);

sort($arr);

$count = count($arr);

$diff_arr = array();

for($i = $count - 1; $i >= 0; $i --) {

for ($j = 0; $j < $count; $j ++) {

if($arr[$i] <= $arr[$j]) {

continue 2;

}

$diff_arr[] = $arr[$i] - $arr[$j];

}

}

if(count($diff_arr) === count(array_unique($diff_arr))) {

return true;

}

return false;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值