算法 -- 把整数分解成若⼲个连续整数和的形式&PHP

10 篇文章 0 订阅

把整数分解成若⼲个连续整数和的形式

题目描述:

        某些整数能分解成若⼲个连续整数的和的形式。

        例如:

        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,欢迎点击!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值