基于高斯算法 CSDN挑战编程题自己尝试的设计思路

package com.test.csdn.challeng;
/**
 * 高斯在上小学时发明了等差数列求和公式:1+2+..+100=5050。
 * 现在问题在于给你一个正整数n,问你他可以表示为多少种连续正整数之和?(自身也算)。 
 * 输入格式: 多组数据,每组数据一行,一个正整数n。
 * 0<n<2000000000 输出格式: 每组数据一行,包含一个正整数,表示结果
 * @author<br>
 *  1=1     <br>
 *  2=2     <br>
 *  3=3     <br>
 *  1+2=3   <br>
 *  4=4     <br>
 *  5=5     <br>
 *  2+3=5   <br>
 *  6=6     <br>
 *  1+2+3=6 <br>
 *  7=7     <br>
 *  3+4=7   <br>
 *  8=8     <br>
 *  9=9     <br>
 *  4+5=9   <br>
 *  10=10   <br>
 *  1+2+3+4=10  <br>
 *  :       <br>
 *  :       <br>
 */
public class SumChan {
    
    private static int gaosi(int start,int end){
        return (start+end)*(end-start+1)/2;
    }
    /**高斯公式
     * @param args
     */
    public static void main(String[] args) {
        int expectNum = 50;//预想最终的值
        int maxend = (expectNum+1)/2;//连续序列的最大值,不可能超过此最大值
        int start = 1;
        int end =2;
        System.out.println("整数本身:"+expectNum);
        while(end>start&&end<=maxend){
            //在序列最大值比最小值大而且最大值比连续序列最大值小时,继续逐渐加大最大值
            if(gaosi(start,end)<expectNum){
                end++;
            }else if(gaosi(start,end)>expectNum){
                start++;
            }else{               
                for(int i=start;i<=end;i++){
                    System.out.print(i+",");
                }
                System.out.println();
                start++;   
            }
        }
        
    }

}
不知道这样性能是否最优,如有更好设计可以留言探讨
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值