引用
自然数写为连续正整数之和
一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
输入数据:一个正整数,以命令行参数的形式提供给程序。
输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出“NONE”。
例如,对于15,其输出结果是:
15=1+2+3+4+5
15=4+5+6
15=7+8
对于16,其输出结果是:
NONE
算法思想:
设x1+x2+...+xi=n, 条件: i>=2,x1<=n/2
其中:
x2=x1+1
x3=x1+2
。。。
xi=x1+i-1
i*x1+i*(i-1)/2=n => x1=(n-i*(i-1)/2 )/i=n/i-(i-1)/2
从运行结果得到一个结论:2的幂次方不能表示为连续正整数之和。
public static void conPlus(int value) {
int count = value / 2;
int[] result = new int[count];
int sum = 0;
int resultCount = 0;
for (int i = 0; i < count; i++)
result[i] = 0;
for (int index = 2; index < count; index++) {
result[0] = value / index - (index - 1) / 2;
if (result[0] <= 0)
break;
sum += result[0];
for (int j = 1; j < index; j++) {
result[j] = result[j - 1] + 1;
sum += result[j];
}
if (sum == value) {
resultCount++;
System.out.print(value + "=");
for (int i = 0; i < index - 1; i++) {
System.out.print(result[i] + "+");
}
System.out.println(result[index - 1]);
}
sum = 0;
}
if (resultCount == 0)
System.out.println("NONE");
}
i=10 |
10=1+2+3+4 |
i=11 |
11=5+6 |
i=12 |
12=3+4+5 |
i=13 |
13=6+7 |
i=14 |
14=2+3+4+5 |
i=15 |
15=7+8 |
15=4+5+6 |
15=1+2+3+4+5 |
i=16 |
NONE |
i=17 |
17=8+9 |
i=18 |
18=5+6+7 |
18=3+4+5+6 |
i=19 |
19=9+10 |
i=20 |
20=2+3+4+5+6 |
i=21 |
21=10+11 |
21=6+7+8 |
21=1+2+3+4+5+6 |
i=22 |
22=4+5+6+7 |
i=23 |
23=11+12 |
i=24 |
24=7+8+9 |
i=25 |
25=12+13 |
25=3+4+5+6+7 |
i=26 |
26=5+6+7+8 |
i=27 |
27=13+14 |
27=8+9+10 |
27=2+3+4+5+6+7 |
i=28 |
28=1+2+3+4+5+6+7 |
i=29 |
29=14+15 |
i=30 |
30=9+10+11 |
30=6+7+8+9 |
30=4+5+6+7+8 |
i=31 |
31=15+16 |
i=32 |
NONE |
i=33 |
33=16+17 |
33=10+11+12 |
33=3+4+5+6+7+8 |
i=34 |
34=7+8+9+10 |
i=35 |
35=17+18 |
35=5+6+7+8+9 |
35=2+3+4+5+6+7+8 |
i=36 |
36=11+12+13 |
36=1+2+3+4+5+6+7+8 |
i=37 |
37=18+19 |
i=38 |
38=8+9+10+11 |
i=39 |
39=19+20 |
39=12+13+14 |
39=4+5+6+7+8+9 |
i=40 |
40=6+7+8+9+10 |
i=41 |
41=20+21 |
i=42 |
42=13+14+15 |
42=9+10+11+12 |
42=3+4+5+6+7+8+9 |
i=43 |
43=21+22 |
i=44 |
44=2+3+4+5+6+7+8+9 |
i=45 |
45=22+23 |
45=14+15+16 |
45=7+8+9+10+11 |
45=5+6+7+8+9+10 |
45=1+2+3+4+5+6+7+8+9 |
i=46 |
46=10+11+12+13 |
i=47 |
47=23+24 |
i=48 |
48=15+16+17 |
i=49 |
49=24+25 |
49=4+5+6+7+8+9+10 |
i=50 |
50=11+12+13+14 |
50=8+9+10+11+12 |
i=51 |
51=25+26 |
51=16+17+18 |
51=6+7+8+9+10+11 |
i=52 |
52=3+4+5+6+7+8+9+10 |
i=53 |
53=26+27 |
i=54 |
54=17+18+19 |
54=12+13+14+15 |
54=2+3+4+5+6+7+8+9+10 |
i=55 |
55=27+28 |
55=9+10+11+12+13 |
55=1+2+3+4+5+6+7+8+9+10 |
i=56 |
56=5+6+7+8+9+10+11 |
i=57 |
57=28+29 |
57=18+19+20 |
57=7+8+9+10+11+12 |
i=58 |
58=13+14+15+16 |
i=59 |
59=29+30 |
i=60 |
60=19+20+21 |
60=10+11+12+13+14 |
60=4+5+6+7+8+9+10+11 |
i=61 |
61=30+31 |
i=62 |
62=14+15+16+17 |
i=63 |
63=31+32 |
63=20+21+22 |
63=8+9+10+11+12+13 |
63=6+7+8+9+10+11+12 |
63=3+4+5+6+7+8+9+10+11 |
i=64 |
NONE |
i=65 |
65=32+33 |
65=11+12+13+14+15 |
65=2+3+4+5+6+7+8+9+10+11 |
i=66 |
66=21+22+23 |
66=15+16+17+18 |
66=1+2+3+4+5+6+7+8+9+10+11 |
i=67 |
67=33+34 |
i=68 |
68=5+6+7+8+9+10+11+12 |
i=69 |
69=34+35 |
69=22+23+24 |
69=9+10+11+12+13+14 |
i=70 |
70=16+17+18+19 |
70=12+13+14+15+16 |
70=7+8+9+10+11+12+13 |
i=71 |
71=35+36 |
i=72 |
72=23+24+25 |
72=4+5+6+7+8+9+10+11+12 |
i=73 |
73=36+37 |
i=74 |
74=17+18+19+20 |
i=75 |
75=37+38 |
75=24+25+26 |
75=13+14+15+16+17 |
75=10+11+12+13+14+15 |
75=3+4+5+6+7+8+9+10+11+12 |
i=76 |
76=6+7+8+9+10+11+12+13 |
i=77 |
77=38+39 |
77=8+9+10+11+12+13+14 |
77=2+3+4+5+6+7+8+9+10+11+12 |
i=78 |
78=25+26+27 |
78=18+19+20+21 |
78=1+2+3+4+5+6+7+8+9+10+11+12 |
i=79 |
79=39+40 |
i=80 |
80=14+15+16+17+18 |
i=81 |
81=40+41 |
81=26+27+28 |
81=11+12+13+14+15+16 |
81=5+6+7+8+9+10+11+12+13 |
i=82 |
82=19+20+21+22 |
i=83 |
83=41+42 |
i=84 |
84=27+28+29 |
84=9+10+11+12+13+14+15 |
84=7+8+9+10+11+12+13+14 |
i=85 |
85=42+43 |
85=15+16+17+18+19 |
85=4+5+6+7+8+9+10+11+12+13 |
i=86 |
86=20+21+22+23 |
i=87 |
87=43+44 |
87=28+29+30 |
87=12+13+14+15+16+17 |
i=88 |
88=3+4+5+6+7+8+9+10+11+12+13 |
i=89 |
89=44+45 |
i=90 |
90=29+30+31 |
90=21+22+23+24 |
90=16+17+18+19+20 |
90=6+7+8+9+10+11+12+13+14 |
90=2+3+4+5+6+7+8+9+10+11+12+13 |
i=91 |
91=45+46 |
91=10+11+12+13+14+15+16 |
91=1+2+3+4+5+6+7+8+9+10+11+12+13 |
i=92 |
92=8+9+10+11+12+13+14+15 |
i=93 |
93=46+47 |
93=30+31+32 |
93=13+14+15+16+17+18 |
i=94 |
94=22+23+24+25 |
i=95 |
95=47+48 |
95=17+18+19+20+21 |
95=5+6+7+8+9+10+11+12+13+14 |
i=96 |
96=31+32+33 |
i=97 |
97=48+49 |
i=98 |
98=23+24+25+26 |
98=11+12+13+14+15+16+17 |
i=99 |
99=49+50 |
99=32+33+34 |
99=14+15+16+17+18+19 |
99=7+8+9+10+11+12+13+14+15 |
99=4+5+6+7+8+9+10+11+12+13+14 |
分享到:
相关推荐
给定一个整数n,求出所有连续的且和为n正整数。比如对于整数27,结果为2~7、8~10、13和14,因为这些数之间的整数的和都是27。注意:并不是所有的整数都有结果,例如不存在连续的整数和为16。为了提高计算的效率,...
证明:对任意正整数n,都存在连续n个正整数,它们都是合数.pdf
对于给定的正整数的集合S={x1,x2,...,xn}和正整数c,编程计算S 的一个子集 S1,使得x∈S1,∑x=c. Input 由文件input.txt 提供输入数据。文件第1 行有2 个正整数n 和c,n 表示S 的大小,c 是子集和的目标值。接...
输入两个正整数m和n,求其最大公约数和最小公倍 数。
算法-求正整数2和n之间的完全数(信息学奥赛一本通-T1150).rar
c++ 实现一个自然数表示成几个自然数的和,输出所有自然数和的表示方式
大于1 的正整数n可以分解为:n=x1*x2*…*xm。 例如,当n=12 时,共有8 种不同的分解式: 12=12; 12=6*2; 12=4*3; 12=3*4; 12=3*2*2; 12=2*6; 12=2*3*2; 12=2*2*3。 编程任务: 对于给定的正整数n,编程...
问题描述: 给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列成一个新的正整数。...给定n (1)位的正整数a和k,此时,k小于n。 试着设计一个算法,找出删去k个数,剩下数字组成的新数最小的删数方案。
设n是一个正整数,现在要将n分解为若干个互不相同的自然数的和,且使这些数的乘积最大。
编写一个程序。要求将一个自然数拆分成任意个自然数相加,要求这几个数的乘积是最大的 自然数n拆分成m个自然数,要求这几个数的乘积是最大的,必为n/m及其临近数.
输入一个自然数n,求1~n之间的所有自然数之和。
算法设计:对于给定的正整数的集合S={x1,x2,...,xn}和正整数c,计算S的一个子集S1,使得子集里的元素之和为c。 数据输入:由文件input.txt提供输入数据。文件第1行有2个正整数n和c,n表示S的大小,c是子集和的目标值...
(1)现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大。 (2)现在将n分解为若干个自然数之和,且使这些自然数的乘积最大。 编程任务:对于给定的正整数n,编程计算问题(1)和(2)的最优分解...
整数拆分整数拆分整数拆分整数拆分整数拆分整数拆分整数拆分整数拆分
例如:1998+1999+2000+2001+2002=10000,是一个累加和等于 N 的连续的自然数段。 输出每个累加和等于 N 的连续的自然数段的第一个数和最后一个数,两数之间用符号~隔开,每段一行,所有行按每行的第一个数从小到大...
2120 - 连续自然数和
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10 100 。 输出格式: 在一行内输出 n...
计算并输出n(包括n)以内能被3或5整除的所有自然数之和的简单C++程序
1.设一背包可容物品的最大质量为m,现有n件物品,质量为(w1, w1,…,wn),wi均为整数,从n件物品中挑选若干件,使放入背包的质量之和正好为m。 2.对于任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和:...