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++;
}
}
}
}
不知道这样性能是否最优,如有更好设计可以留言探讨
基于高斯算法 CSDN挑战编程题自己尝试的设计思路
最新推荐文章于 2023-05-16 15:20:22 发布