把整数分解成若⼲个连续整数和的形式
题目描述:
某些整数能分解成若⼲个连续整数的和的形式。
例如:
15 = 1 + 2+3+4+5
15 = 4 + 5 + 6
15 = 7 + 8
某些整数不能分解为连续整数的和,例如:16
输⼊:⼀个整数N(N <= 10000)
输出:整数N对应的所有分解组合,按照每个分解中的最⼩整数从⼩到⼤输出,每个分解占⼀⾏,每个数字之间有⼀个空格(每⾏最后保留⼀个空格);如果没有任何分解组合,则输出NONE。
实现思路:
1. 个人对这个题目的理解是,先从数学的角度分析,N就是分解成所有 连续整数的和,所以:设初始数为m,有k个数,则末尾数为m+k-1,分正整数和负整数,可得和 :z=(m+m+k-1)*k/2,即:(2m+k-1)*k=z*2;
2. 循环得出所有分解的组合,返回数组,如:方法decompose();
3. 然后,循环打印出所有组合。
代码实现:
// 打印过程
function printing($num)
{
if (floor($num)!=$num || $num>10000){
echo '请输入 N <= 10000 的整数!';
die;
}
$arr = decompose($num);
if ($arr == 'NONE') {
echo 'NONE';
die;
}
echo '分解组合如下:';
$group = [];
foreach ($arr as $v) {
$group[] = range($v[0], $v[1] + $v[0] - 1);
}
echo '(共', count($group), '组)';
echo '<br>';
foreach ($group as $k => $v) {
echo '第' . ($k + 1) . '组:';
foreach ($v as $vv) {
echo $vv . ' ';
}
echo '<br>';
}
}
// 分解过程
function decompose($num)
{
$arr = [];
if ($num < 0) {
// 负整数处理
for ($i = -1; $i > $num; $i--) {
for ($j = 2; $j < abs($num); $j++) {
if (2 * $num == (2 * $i + $j - 1) * $j) {
$arr[] = [$i, $j];
}
}
}
} else {
// 负整数处理
for ($i = 1; $i < $num; $i++) {
for ($j = 0; $j < $num; $j++) {
if (2 * $num == (2 * $i + $j - 1) * $j) {
$arr[] = [$i, $j];
}
}
}
}
if (empty($arr)) {
return 'NONE';
} else {
return $arr;
}
}
函数调用:
printing(15);
echo '-----','<br>';
printing(-22);
echo '-----','<br>';
printing(16);
输出结果:
分解组合如下:(共3组)
第1组:1 2 3 4 5
第2组:4 5 6
第3组:7 8
-----
分解组合如下:(共2组)
第1组:-7 -6 -5 -4
第2组:-7 -6 -5 -4 -3 -2 -1 0 1 2 3
-----
NONE
最后总结:
其中,printing()方法中也也用了一些验证,如验证是否是整数的floor。一些数字生成函数range,decompose()方法中,正负整数需要分开循环,负整数的初始整数要$i--,正整数的初始整数要$i++。谢谢查阅,欢迎指导!
千而の大狮子!
ps:个人主页:www.qianern.cn,欢迎点击!