题目:比如说15=1+2+3+4+5,15=4+5+6,15=7+8都是连续数字的和
求100内所有的此数(能满足连续数的和),并输出有几种可能。
比如说15满足此要求,并有15=1+2+3+4+5,15=4+5+6,15=7+8三种可能!
求100内所有的此数(能满足连续数的和),并输出有几种可能。
比如说15满足此要求,并有15=1+2+3+4+5,15=4+5+6,15=7+8三种可能!
两个连续数之和
三个连续数之和
。
十三个连续数之和【1-12 最大91】相加的话,从1开始
两个数 1+2 2+3 3+4 ....
三个数 1+2+3 2+3+4.....
和必须小于100,否则结束用一个Map统计每个数的方案数
import java.util.*;
public class CsdnDemo { /**
* @param args
*/
public static void main(String[] args) {
int sum ;
int j;
int n=1;
List<Integer> list = new ArrayList<Integer>();
for(int i=1;i<45;i++){
sum= 0;
j=i;
n=1;
while(sum<100){
sum = sum+j;
j++;
n++;
if(n>2 && sum <100){
list.add(sum);
}
}
}
Iterator<Integer> it = list.iterator();
int f=0;
while(it.hasNext()){
f++;
int s = it.next();
System.out.print(s +" ,");
//System.out.println(f);
}
System.out.println("\n一共的方法有");
System.out.println(f);
}}
public class Split { /**
* @param args
*/
public void output(int n, int i) {
int start;
if (i % 2 == 0) {
start = n / i - i / 2 + 1;
for (int j = 0; j < i; j++) { System.out.print(start + j + " ");
}
System.out.println("");
} else {
start = n / i - i / 2 + 1 / 2;
for (int j = 0; j < i; j++) { System.out.print(start + j + " ");
}
System.out.println("");
}
}
/*
* 分割的算法包含在这里面
*/
public void split(int n) {
int value=0;
for (int i = 2; i < n; i++) {
/*
* n代表要分割的数字,i是分割的i个连续数之和
* 他们要满足下面的条件就代表n能分割
*/
if (i % 2 == 0) {
if (n % i == i / 2 && n / i - i / 2 >= 0) {
output(n, i);
value++;
}
} else {
if (n % i == 0 && n / i - i / 2 + 1 / 2 > 0) {
output(n, i);
value++;
}
}
}
if(value>0)
System.out.println(n+"可分隔次数:"+value);
} public static void main(String[] args) {
// TODO Auto-generated method stub Split s = new Split();
for(int i=1;i<=100;i++){
s.split(i);
}
}}代码逻辑比较简单,就是那个算法 有点复杂。
n % i == i / 2 && n / i - i / 2 >= 0这句就是算法的关键 不加那就死菜菜了n可能被分隔成奇数个或者偶数个连续的数的和当它可分割成奇数个时就必须满足n % i == 0 && n / i - i / 2 + 1 / 2 > 0这个是数学的事。看出的规律。。你自己拿几个数拆下 找到规律 就可以写代码了算法题不是急着写,先分析。分析好了,算法的效率会高很多的。
(e+s)*(e-s+1)/2=Sum
s为开始的数,e为结束的数,Sum为结果Sum现在已知
再用一个循环从1开始到Sum/2,给s赋值,s也为已知
再用一元二次方程求实根,如果结果刚好是正整数即求得解,从s到e的连续数相加得sum
List[] arr = new List[100];
for (int i = 2; i <= arr.length; i++) {
int x = (1 + i) * i / 2;
int k = 0;
while (x <= arr.length) {
if (arr[x - 1] == null) {
arr[x - 1] = new LinkedList();
}
arr[x - 1].add(0, new int[]{1 + k, i + k});
x += i;
k++;
}
}
for (int i = 0; i < arr.length; i++) {
if (arr[i] != null) {
System.out.format("%3d : ", i + 1);
for (int[] t : (List<int[]>) arr[i]) {
System.out.format("%2d+...+%2d ", t[0], t[1]);
}
System.out.println();
}
}
}
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
for (int i = 1; i <= 100; i++) {
myMethod(i);
a = 1;
System.out.print('\n');
} } public static void myMethod(int input) {
int sum = 0;
int c = a;//c为相加的第一个数
int b = 0;//用于控制相加的次数
for (int i = a; a < input; i++) {
sum = sum + i;
b++;
if (sum == input) {
System.out.print(input + "=");
for (int j = 1; j < b; j++) {
System.out.print(c + "+");
c++;
if (j == b - 1) {
System.out.print(c + " ");
a++;
myMethod(input);
}
}
} else if (sum > input) {
a++;
myMethod(input);
}
}
}
}