【基本算法】拆分为连续正整数之和
来源:互联网 发布:java手册破解版下载 编辑:程序博客网 时间:2024/06/05 10:36
整数拆分:即把一个给定的正整数拆分为若干个连续正整数之和
例如: 将输入一个整数15,可以拆分为:
15 = 1+2+3+4+5
15 = 4+5+6
15=7+8
分析:
由题可知,拆分的起始项i不会超过该数n的一半减一(1~(n-1)/2),累加项不会超过该数的一半加一(i~(n+1)/2)
这里可以作为循环的条件,在j循环中若s(总和) >= n(原整数),则退出,否则继续求和。
代码实现:
/** * 拆分连续正整数之和 * @author evan_qb * */public class Demo2 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("请输入拆分数n:");int n = input.nextInt();//统计个数int count = 0;//起始项范围:1 ~ (n-1)/2for (int i = 1; i <= (n-1)/2; i++) {//定义求和的结果int sum = 0;//累加项范围:i ~ (n+1)/2 for (int j = i; j <= (n+1)/2; j++) {sum += j;if (sum >= n) {if (sum == n) {//个数加一count++;if (j - i == 1) {System.out.println(count + ":" + i + "+" + j);}else{System.out.println(count + ":" + i + "+ ... +" + j);}break;}}}}System.out.println("共有" + count + "个解!!!");input.close();}}
运行结果如下:
算法优化:
优化要点:
累加项个数优化:
设正整数的个数为k,k的最大值为t
1+2+...+ t = t*(t+1)/2 = n,即t < sqrt(2t)
设起始值m的连续k项(2<= k < t)之和为n
m + (m+1) + ... + (m+k-1) = k*(2*m + k -1)/2 = n
推出:
m = (2*n/k-k+1)/2
在循环中:
正整数的个数k的范围为: 2 ~ t,如果2*n不能被k整除,或(2*n/k-k+1)不能被2整除,说明此时m不是整数,则返回。
否则为正整数 m = (2*n/k-k+1)/2,即为解
代码实现:
/** * 拆分数优化版 */public void test1(){Scanner input = new Scanner(System.in);System.out.println("请输入拆分数n:");long n = input.nextLong();//统计个数int count = 0;//t为拆分项的最大个数long t = (long) Math.sqrt(2*n);//k为拆分项的个数for (long k = 2; k <= t; k++) {//判断是否存在这个整数使得m + (m+1) + ... + (m+k-1) = k*(2*m + k -1)/2(各个项之和) = n(拆分数)if ((2*n) % k != 0 || (2*n/k - k + 1) % 2 > 0) {continue;}//设置起始项为startlong start = (2*n/k - k + 1)/2;//满足的条件的个数count++;//打印出来if (k == 2) {System.out.println(count + ":" + start + "+" + (start + k -1));}else{System.out.println(count + ":" + start + "+ ... +" + (start + k -1));}}System.out.println("一共有" + count + "个解");input.close();}
运行结果:
阅读全文
1 0
- 【基本算法】拆分为连续正整数之和
- 拆分为连续正整数之和
- 把输入整数拆分为连续的正整数之和
- 实现连续正整数之和为某个特定值【算法】
- 实现连续正整数之和为某个特定值【算法】
- 正整数分解为几个连续自然数之和
- 一个整数分解为连续正整数之和
- 正整数分解为几个连续自然数之和
- 正整数分解为几个连续自然数之和
- 正整数分解为几个连续自然数之和
- 整数拆分为连续自然数之和
- 整数拆分为连续自然数之和
- 一个正整数分解为几个连续的正整数之和
- 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和--算法求解
- 每天一到算法练习题1 -- 一个正整数有可能可以被表示为 n(>=2) 个连续正整数之和
- 连续正整数之和
- 连续正整数之和
- 连续正整数之和
- HQL分页显示对象
- JSP通过JDBC连接ORACLE数据库
- Linux下网络编程(二)
- EditText的输入联动及其他一些用法总结
- 网易2017春招笔试--移除重复元素
- 【基本算法】拆分为连续正整数之和
- 计蒜课_F. Falling Apart
- 快速申请iOS证书(.p12)和(.mobileprovision)
- HQL的参数绑定案例
- 无人机驾驶员培训学习记录(十七)
- 软件测试面试题:给你任意指定生活中的一件物品,你会怎么测试?
- 【JavaScript】let与var的区别及变量、函数提升
- C语言详解(3)变量的数据--关键字auto、register、static
- 华为手机的相关Log开关 USB开关