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) { for(int i=1; i<=1000; i++){ go(i); } }
{
int sum;
for(int i=1;i<=100;i++)
{
sum=0;
for(int j=i;j<=100;j++)
{
sum+=j;
if(sum<100 )
{
if(sum!=j)
{
for(int k=i;k<=j;k++)
{
System.out.print(k);
if(k!=j)
System.out.print("+");
}
System.out.println("="+sum);
}
}
else
{
break;
}
}
}
}
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) {
for(int i=1; i<=1000; i++){
go(i);
}
}
void from(int start){
sum = start +from(start + 1)}试试 迭代 代码没时间写了
假设找到n个连数的和为N,设n个连数的最小值为m,则 m+(m+1)+(m+2)+...+(m+n-1) = N
根据等差数列求和公式
即 (m+m+n-1)*n / 2 = N;
再转 (m*2+n-1)*n = N *2;//注意 m*2+n-1和n一个为奇数一个为偶数求解思路:
对N*2进行因数分解,必须满足 其中一个为奇数,另外一个为偶数.将任何一个因数赋值给n,则m*2+n-1为另外一个因数,计算出m.由此求出n个连数.
boolean find = false;
for (int i = 3; i * i <= N * 2; i += 2) {
if ((N * 2) % i == 0)// 整除
{
find |= show(N, i);
find |= show(N, N * 2 / i);
}
}
if (!find)
System.out.println(N + " 不存在连数");
} private static boolean show(int N, int n) {
int m = (N * 2 / n + 1 - n) / 2;
if (m <= 0)
return false; // 这里判断m是否为自然数
int[] array = new int[n];
for (int i = 0; i < n; i++)
array[i] = m + i;
System.out.println(N + "=" + Arrays.toString(array));
return true;
}测试代码 check(100);
check(40);
check(999);
check(8);测试结果100=[18, 19, 20, 21, 22]
40=[6, 7, 8, 9, 10]
999=[332, 333, 334]
999=[107, 108, 109, 110, 111, 112, 113, 114, 115]
999=[24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
999=[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, 37, 38, 39, 40, 41, 42, 43, 44, 45]
8 不存在连数
/**
@version 1.11 2000-04-22
@author Cay Horstmann
*/public class Welcome { public static void main(String[] args) {
int i = 1;
int j = 100;
System.out.println((i + j) * 100 / 2); }}
上面有人说求每个可以用连数表示的用遍历(从1开始到<这个数)这也是一种情况
所以很不确定,实际上这是一道算法上的题,编程并不是很难,只要把可能的情况举例写出来,代码就是简单的for循环语句和输出语句
public class TestJoinDigit { public static void main(String[] args) {
printJoinDigit(1,1000);
} public static void printJoinDigit(int start, int end) {
for (int i = start; i <= end; i++) {
//一个数最多连数个数j(1+j)/2=i,从1开始,j<sqrt(2*i)
for (int j = 2; j <= (int) Math.sqrt(2*i); j++) {
String join = parseDigit(i, j);
//打印
if (join != null) {
String[] joinarr = join.split(":");
int s = Integer.parseInt(joinarr[0]);
int e = Integer.parseInt(joinarr[1]);
StringBuffer sb = new StringBuffer("数"+i+"的"+j+"连数:");
for(int n=s;n<=e;n++){
sb.append(n+" ");
}
System.out.println(sb.toString());
}
}
}
} /**
*
* @param digit:分析的数字
* @param n:连数个数
* @return:符合条件的连数起始数和结束数字符串或者null
*/
public static String parseDigit(int digit, int n) {
StringBuffer sn = new StringBuffer();
if (n % 2 == 1) {// 奇数个连数
if (digit % n == 0) {
return sn.append(digit / n - (n - 1) / 2).append(":").append(
digit / n + (n - 1) / 2).toString();
}
} else {// 偶数个连数
if (((2 * (digit / n) + 1)) * n / 2 == digit) {
return sn.append(digit / n - n / 2 + 1).append(":").append(
digit / n + n / 2).toString();
}
}
return null;
}}
import java.util.*;
public class Test {
public static void main(String[] args) {
int num, start = 1, sum = 0, flag=0;;
List<Integer> array = new ArrayList<Integer>();
for(num=1; num<1000; num++){
while(sum != num) {
sum+=start;
start++;
//判断sum是否等于num
if(sum>num){
sum = 0;
flag ++;
start = flag + 1;
}
}
//判断num是否能够分解
if(flag+1 != start-1) {
array.add(new Integer(sum));
}
//初始化sum,flag,start,准备计算下个数
sum = 0;
flag = 0;
start = 1;
}
System.out.println("共有:" + array.size());
System.out.print("它们是:");
for(int i=0; i<array.size(); i++){
if ((i+1) % 25 != 0){
System.out.print(array.get(i) + " ");
}else {
System.out.println(array.get(i));
}
}
}
}