public class Test { public static void main(String[] args) { guest(105); } public static void guest(int number) { StringBuffer strb = new StringBuffer(); int count = 1; int sum = 1; while (true) { if (((number - sum) % ++count) == 0) { int min = (number - sum) / count; strb.append(number + " = " + min); for (int i = 1; i < count; i++) { strb.append(" + " + (min + i)); } strb.append("\r\n"); } sum = sum + count; if ((number - sum) < count) break; } System.out.println(strb.toString()); } }
public static void Result(int N){ for(int i = 2 ; i <= N / 2 ; i++){ for( int k = 0 ; ; k++){ int sum = i * k + (i + 1) * i / 2 ; if(N == sum){ System.out.print(N + " = " + (++k)); for(int j = 1 ; j < i ; j++){ System.out.print("+" + (++k)); } System.out.println(); break ; } if( sum > N){ break ; } } } }
public static void guest(int number) { StringBuffer strb = new StringBuffer(); int count = 1; int sum = 1; while (true) { //如果满足下面所说思路的条件,说明有相加的形式 if (((number - sum) % ++count) == 0) { //找到相连数中最小的数 int min = (number - sum) / count; strb.append(number + " = " + min); //count 表示有多少个数要相加 for (int i = 1; i < count; i++) { strb.append(" + " + (min + i)); } strb.append("\r\n"); } //在循环中要减去的:就是下面说的4*4+1+2+3 中的1+2+3 sum = sum + count; //如果相减的结果比数的个数要小就跳出while循环 if ((number - sum) < count) break; } System.out.println(strb.toString()); } 思路是这样的:x-1%2 如果为0那么它一定符合要求 2为有几个相连的数 如: 3+4=7 ,那么7-1/2 为3就是 相连数的最小一个。 所有我只要求出最小的数就行了。4+5+6+7=4*4+1+2+3 ,只要(x-1-2-3)/4 就是最小的那个数。
看了半天,有一个地方还是不太明白,就是sum为什么要从3开始呢
我也来一个 public static void go(int sum) { LinkedList<Integer> list = new LinkedList<Integer>(); int t = 0; for (int i = 1; i < sum; i++) { if (t == sum) { System.out.println(list); } t += i; list.addLast(i); while (t > sum) { t -= list.getFirst(); list.removeFirst(); } } } public static void main(String[] args) { go(66); go(105); }
public class Answer
{
static void printResult(int x,int start,int n)
{
System.out.print(x + " = " + start++);
for(int i=1;i<n;i++)
System.out.print(" + " + start++);
System.out.println();
}
static void guest(int x)
{
for(int sum=3,n=2;sum<=x;sum+=++n)
{
if((x-sum)%n==0)
printResult(x,(x-sum)/n+1,n);
}
}
public static void main(String[] args)
{
guest(5);
guest(6);
guest(66);
guest(105);
}}5 = 2 + 3
6 = 1 + 2 + 3
66 = 21 + 22 + 23
66 = 15 + 16 + 17 + 18
66 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11
105 = 52 + 53
105 = 34 + 35 + 36
105 = 19 + 20 + 21 + 22 + 23
105 = 15 + 16 + 17 + 18 + 19 + 20
105 = 12 + 13 + 14 + 15 + 16 + 17 + 18
105 = 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15
105 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14
public static void main(String[] args) {
guest(105);
} public static void guest(int number) {
StringBuffer strb = new StringBuffer();
int count = 1;
int sum = 1;
while (true) {
if (((number - sum) % ++count) == 0) {
int min = (number - sum) / count;
strb.append(number + " = " + min);
for (int i = 1; i < count; i++) {
strb.append(" + " + (min + i));
}
strb.append("\r\n");
}
sum = sum + count;
if ((number - sum) < count)
break;
}
System.out.println(strb.toString());
}
}
for(int i = 2 ; i <= N / 2 ; i++){
for( int k = 0 ; ; k++){
int sum = i * k + (i + 1) * i / 2 ;
if(N == sum){
System.out.print(N + " = " + (++k));
for(int j = 1 ; j < i ; j++){
System.out.print("+" + (++k));
}
System.out.println();
break ;
}
if( sum > N){
break ;
}
}
}
}
package com.isw2.test;public class Test {
public static void disValue(int begin, int size, int value) {
System.out.print(value + " = " + begin++);
for (int count = 1; count < size; count++, begin++) {
System.out.print(" + " + begin);
}
System.out.println();
} public static void findValue(int value) {
//value = (begin + end)*size / 2
for (int size = 2; size < value; size++) {
int tempValue = 2 * value;
if (0 == tempValue % size) {
if (0 == (tempValue / size + 1 - size) % 2) {
int begin = (tempValue / size + 1 - size) / 2;
disValue(begin, size, value);
}
}
}
} public static void main(String[] args) {
findValue(105);
}
}
105 = -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15
105 = -11 + -10 + -9 + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18
105 = -14 + -13 + -12 + -11 + -10 + -9 + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20
105 = -18 + -17 + -16 + -15 + -14 + -13 + -12 + -11 + -10 + -9 + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23
105 = -33 + -32 + -31 + -30 + -29 + -28 + -27 + -26 + -25 + -24 + -23 + -22 + -21 + -20 + -19 + -18 + -17 + -16 + -15 + -14 + -13 + -12 + -11 + -10 + -9 + -8 + -7 + -6 + -5 + -4 + -3 + -2 + -1 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36
原理如下:假设x可以表示为n个连续的自然数之和,这n个自然从s(start)开始,为:s,s+1,...s+n-1,由等差数列求和公式:(s+s+n-1)*n/2=x==>2*n*s+(n-1)*n=2*x==>2*n*s=2*x-(n-1)*n (n-1)n
==>n*s=x - ------
2
这时(n-1)*n/2就是1+2+...(n-1),把它记为sum(1..n-1),则: x-sum(1..n-1)
==>s=-------------- .......(公式1)
n所以只要能保证分式能整除,就可以得到一个s,也就能得到一个结果.
楼主用的,在上面的公式上稍要变换: x-sum(1..n-1)
==>s-1=------------- - 1
n
x-sum(1..n-1)-n x-sum(1..n)
==>s-1=--------------- = -----------
n n
x-sum(1..n)
==>s=------------ + 1 ........(公式2)
n如果用公式2编程,就是1楼的代码,如果用公式1编程,可以: static void guest(int x){
for(int sum=1,n=2;sum<x;sum+=n++){
if((x-sum)%n==0)
printResult(x,(x-sum)/n,n);
}
}
还可以用前面推导过程中的中间式编程,但比起用公式1和公式2的代码来,效率差些。
StringBuffer strb = new StringBuffer();
int count = 1;
int sum = 1;
while (true) {
//如果满足下面所说思路的条件,说明有相加的形式
if (((number - sum) % ++count) == 0) {
//找到相连数中最小的数
int min = (number - sum) / count;
strb.append(number + " = " + min);
//count 表示有多少个数要相加
for (int i = 1; i < count; i++) {
strb.append(" + " + (min + i));
}
strb.append("\r\n");
}
//在循环中要减去的:就是下面说的4*4+1+2+3 中的1+2+3
sum = sum + count;
//如果相减的结果比数的个数要小就跳出while循环
if ((number - sum) < count)
break;
}
System.out.println(strb.toString());
}
思路是这样的:x-1%2 如果为0那么它一定符合要求 2为有几个相连的数 如: 3+4=7 ,那么7-1/2 为3就是
相连数的最小一个。 所有我只要求出最小的数就行了。4+5+6+7=4*4+1+2+3 ,只要(x-1-2-3)/4 就是最小的那个数。
public static void go(int sum) {
LinkedList<Integer> list = new LinkedList<Integer>();
int t = 0;
for (int i = 1; i < sum; i++) {
if (t == sum) {
System.out.println(list);
}
t += i;
list.addLast(i);
while (t > sum) {
t -= list.getFirst();
list.removeFirst();
}
}
} public static void main(String[] args) {
go(66);
go(105);
}
public class SumArray {
public static void main(String[] args) {
for(int a = 0 ; a < args.length ; a++){ //获得所有输入的数
int temp = Integer.parseInt(args[a]);
for(int j = 1 ; j < temp; j++){ //j为序列中第一个数,如5=2+3中,j对应2
for(int i = 1 ; i < temp;i++){
if((i*j + (i-1)*i/2)==temp){ //i为序列的长度
int b = j;
System.out.print(temp + " = ");
while(i-- > 0){
System.out.print(b++ + " ");
}
System.out.println();
break;
}
}
}
}
}
}main(String[] args)的args为“5 6 66 105”,则结果为:
5 = 2 3
6 = 1 2 3
66 = 1 2 3 4 5 6 7 8 9 10 11
66 = 15 16 17 18
66 = 21 22 23
105 = 1 2 3 4 5 6 7 8 9 10 11 12 13 14
105 = 6 7 8 9 10 11 12 13 14 15
105 = 12 13 14 15 16 17 18
105 = 15 16 17 18 19 20
105 = 19 20 21 22 23
105 = 34 35 36
105 = 52 53