【算法学习-01】 输入一个正数 n,输出所有和为 n 连续正数序列。

本文介绍了两种不同的算法来寻找可以组成特定整数的所有连续整数序列。方案一使用了区间移动的方式,通过调整区间的边界来寻找符合条件的连续整数序列。方案二则基于数学公式,寻找能够被2n整除的值来确定连续整数的范围。

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

【算法学习】为我记录一些算法的集合,解法不一定是我 自己原创的,但是代码的编写一定是我自己的。如果解法是别人的,一定会注明参考。下面是第一篇。

方案一:区间移动的方案,详细见参考。

例如:n=15,原始区间low=1,high=2,区间和为sum=3。

sum=n,输出;

sum<n,high++,sum+=high;

sum>n,sum-=low,low++;

循环的截止条件是low=midlle/2;

参考1:http://blog.youkuaiyun.com/dazhong159/article/details/7991758

/*方案1:移动区间,直到区间的低值到(1+n)/2*/
    public static void continueValues (int n) {
        int low=1;
        int high=2;
        int middle=(1+n)/2;
        int sum=low+high;
        while (low<middle) {
            if (sum==n) printValues(low, high);
            while (sum>n) {
                sum-=low;
                low++;
                if (sum==n) printValues(low, high);
            }
            high++;
            sum+=high;
        }
       
    }


方案二:详细见参考2。注意,参考2中认为节的集合在[2,sqrt(n)]。

关键点在于,(m1+(m1+k-1))*k=n*2,求得k,再求m1,

参考2:http://www.cnblogs.com/hoodlum1980/archive/2007/07/13/817188.html

    

/*方案2,查找能被2n整除的值,这个值就是k*/
    public static void continueValues2(int n) {
        for (int i = 2; i <=(int)Math.sqrt(2*n); i++) {
            if ((n*2)%i==0) {
                int temp=n*2-i*i+i;
                if (temp%(2*i)==0) {
                    int low=temp/(i*2);
                    int high=low+i-1;
                    printValues(low, high);
                }
            }
        }
    }
************************************************

我更喜欢第一种没有开根号和乘法、除法特殊运算的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值