- 浏览: 124220 次
- 性别:
- 来自: 抽象空间
最新评论
-
Dancen:
理想状态下jar包的更新当然不应该去修改其中的方法签名等外部依 ...
javamake.jar & javamake-ant15.jar -
mwei:
Dancen 写道javamake可以解决代码之间的依赖问题, ...
javamake.jar & javamake-ant15.jar -
Dancen:
javamake可以解决代码之间的依赖问题,但如果调用的是外部 ...
javamake.jar & javamake-ant15.jar -
kidding87:
看到了楼主的connet by用法,又看到这个很久以前的东西, ...
海螺式初始化二维数组 -
pxlfxl2:
mwei 写道pxlfxl2 写道如果我的需求是要打印A到Z ...
三线程顺序打印N次ABC
原题出处:http://www.iteye.com/topic/927532
使用OO的方式实现会占用更多的内存,在递归调用的时候需要保存每次参数,对性能大打折扣,加大JVM参数到256M后,使用1000测试都会宕掉,然而这里演示的是一种解题思路。
初步结构分析:
java代码如下:
对30测试结果如下:
使用OO的方式实现会占用更多的内存,在递归调用的时候需要保存每次参数,对性能大打折扣,加大JVM参数到256M后,使用1000测试都会宕掉,然而这里演示的是一种解题思路。
初步结构分析:
/** * 将一个自然数拆分为若干不重复自然数之和。 * 以10为例: * 1+9 --对原数据(10)的初次拆分(拆为m+n)应该很容易 * |_2+7 --对9拆分为x+y,x应该大于1,这样就避免了因子重复 * |_3+4 --对7拆分为i+j,i应该大于2,以此规律持续下去 * |_3+6 --此处依然对9拆分 * |_4+5 * 2+8 * |_3+5 * 3+7 --7,在此处无法拆分,否则导致重复 * 4+6 */
java代码如下:
import java.util.ArrayList; import java.util.List; public class SplitNumber { public static void main(String[] args) { SplitNumber.split(30); System.out.println("=>DONE..."); } public static void split(int number){ if(number<3){ System.out.println(number+"=>can not split..."); return; } List<Splitor> outer=new ArrayList<Splitor>(); int half=(number+1) >> 1; //+1 计算奇数与偶数的一半 Splitor s=null; for(int i=1;i<half;i++){ //for-loop:初次拆分为m+n s=new Splitor(); s.smaller=i; // s.bigger=number-i; outer.add(s); s.splitCenter(s); //是对m+n中的n进行深度拆分 } // end for for(Splitor t:outer){ //上面拆分完毕后输出 showRetHelper(t.splitors,t); } } /** * 这个递归很恶心:它要把保存每次传入的参数 * @param sps 按照顺序保存传入的参数 */ private static void showRetHelper(List<Splitor> splitors,Splitor... sps){ int len=sps.length; for(int i=0;i<len;i++){ //每次递归前都要先输出各个因子 if(len==1){ //只有一个就输出 smaller+bigger System.out.print(sps[0]+" "); break; } if(i==len-1){ //最后一个同样输出 smaller+bigger System.out.print(sps[i]+" "); }else { System.out.print(sps[i].smaller+"+"); //不是最后一个就输出小的那个数 } } System.out.println(""); //换行 for(Splitor s:splitors){ showRetHelper(s.splitors,copyArray(sps,s)); //保存每次的参数,递归 } } private static Splitor[] copyArray(Splitor[] src, Splitor s){ //不多说 if(src==null || src.length==0){ return new Splitor[]{s}; }else{ int srcLength=src.length; Splitor[] dest=new Splitor[srcLength+1]; System.arraycopy(src, 0, dest, 0, srcLength); dest[srcLength]=s; return dest; } } //内部类:对数据的包装 private static class Splitor{ private int smaller; private int bigger; private List<Splitor> splitors=new ArrayList<Splitor>(); //作用:构造树 private void add(Splitor s){ this.splitors.add(s); } public void splitCenter(Splitor s){ int half=(s.bigger+1) >>1; //+1 计算奇数与偶数的一半,用于for里的小于 int small=s.smaller+1; //+1 防止重复 if(small>=half) return; Splitor s2=null; for(int i=small;i<half;i++){ s2=new Splitor(); s2.smaller=i; s2.bigger=s.bigger-i; s.add(s2); //s指向s.bigger被拆分的结果集 splitCenter(s2); //recursively 持续拆分 } } @Override public String toString(){ return smaller+"+"+bigger; } } }
对30测试结果如下:
1+29 1+2+27 1+2+3+24 1+2+3+4+20 1+2+3+4+5+15 1+2+3+4+5+6+9 1+2+3+4+5+7+8 1+2+3+4+6+14 1+2+3+4+7+13 1+2+3+4+8+12 1+2+3+4+9+11 1+2+3+5+19 1+2+3+5+6+13 1+2+3+5+7+12 1+2+3+5+8+11 1+2+3+5+9+10 1+2+3+6+18 1+2+3+6+7+11 1+2+3+6+8+10 1+2+3+7+17 1+2+3+7+8+9 1+2+3+8+16 1+2+3+9+15 1+2+3+10+14 1+2+3+11+13 1+2+4+23 1+2+4+5+18 1+2+4+5+6+12 1+2+4+5+7+11 1+2+4+5+8+10 1+2+4+6+17 1+2+4+6+7+10 1+2+4+6+8+9 1+2+4+7+16 1+2+4+8+15 1+2+4+9+14 1+2+4+10+13 1+2+4+11+12 1+2+5+22 1+2+5+6+16 1+2+5+6+7+9 1+2+5+7+15 1+2+5+8+14 1+2+5+9+13 1+2+5+10+12 1+2+6+21 1+2+6+7+14 1+2+6+8+13 1+2+6+9+12 1+2+6+10+11 1+2+7+20 1+2+7+8+12 1+2+7+9+11 1+2+8+19 1+2+8+9+10 1+2+9+18 1+2+10+17 1+2+11+16 1+2+12+15 1+2+13+14 1+3+26 1+3+4+22 1+3+4+5+17 1+3+4+5+6+11 1+3+4+5+7+10 1+3+4+5+8+9 1+3+4+6+16 1+3+4+6+7+9 1+3+4+7+15 1+3+4+8+14 1+3+4+9+13 1+3+4+10+12 1+3+5+21 1+3+5+6+15 1+3+5+6+7+8 1+3+5+7+14 1+3+5+8+13 1+3+5+9+12 1+3+5+10+11 1+3+6+20 1+3+6+7+13 1+3+6+8+12 1+3+6+9+11 1+3+7+19 1+3+7+8+11 1+3+7+9+10 1+3+8+18 1+3+9+17 1+3+10+16 1+3+11+15 1+3+12+14 1+4+25 1+4+5+20 1+4+5+6+14 1+4+5+7+13 1+4+5+8+12 1+4+5+9+11 1+4+6+19 1+4+6+7+12 1+4+6+8+11 1+4+6+9+10 1+4+7+18 1+4+7+8+10 1+4+8+17 1+4+9+16 1+4+10+15 1+4+11+14 1+4+12+13 1+5+24 1+5+6+18 1+5+6+7+11 1+5+6+8+10 1+5+7+17 1+5+7+8+9 1+5+8+16 1+5+9+15 1+5+10+14 1+5+11+13 1+6+23 1+6+7+16 1+6+8+15 1+6+9+14 1+6+10+13 1+6+11+12 1+7+22 1+7+8+14 1+7+9+13 1+7+10+12 1+8+21 1+8+9+12 1+8+10+11 1+9+20 1+10+19 1+11+18 1+12+17 1+13+16 1+14+15 2+28 2+3+25 2+3+4+21 2+3+4+5+16 2+3+4+5+6+10 2+3+4+5+7+9 2+3+4+6+15 2+3+4+6+7+8 2+3+4+7+14 2+3+4+8+13 2+3+4+9+12 2+3+4+10+11 2+3+5+20 2+3+5+6+14 2+3+5+7+13 2+3+5+8+12 2+3+5+9+11 2+3+6+19 2+3+6+7+12 2+3+6+8+11 2+3+6+9+10 2+3+7+18 2+3+7+8+10 2+3+8+17 2+3+9+16 2+3+10+15 2+3+11+14 2+3+12+13 2+4+24 2+4+5+19 2+4+5+6+13 2+4+5+7+12 2+4+5+8+11 2+4+5+9+10 2+4+6+18 2+4+6+7+11 2+4+6+8+10 2+4+7+17 2+4+7+8+9 2+4+8+16 2+4+9+15 2+4+10+14 2+4+11+13 2+5+23 2+5+6+17 2+5+6+7+10 2+5+6+8+9 2+5+7+16 2+5+8+15 2+5+9+14 2+5+10+13 2+5+11+12 2+6+22 2+6+7+15 2+6+8+14 2+6+9+13 2+6+10+12 2+7+21 2+7+8+13 2+7+9+12 2+7+10+11 2+8+20 2+8+9+11 2+9+19 2+10+18 2+11+17 2+12+16 2+13+15 3+27 3+4+23 3+4+5+18 3+4+5+6+12 3+4+5+7+11 3+4+5+8+10 3+4+6+17 3+4+6+7+10 3+4+6+8+9 3+4+7+16 3+4+8+15 3+4+9+14 3+4+10+13 3+4+11+12 3+5+22 3+5+6+16 3+5+6+7+9 3+5+7+15 3+5+8+14 3+5+9+13 3+5+10+12 3+6+21 3+6+7+14 3+6+8+13 3+6+9+12 3+6+10+11 3+7+20 3+7+8+12 3+7+9+11 3+8+19 3+8+9+10 3+9+18 3+10+17 3+11+16 3+12+15 3+13+14 4+26 4+5+21 4+5+6+15 4+5+6+7+8 4+5+7+14 4+5+8+13 4+5+9+12 4+5+10+11 4+6+20 4+6+7+13 4+6+8+12 4+6+9+11 4+7+19 4+7+8+11 4+7+9+10 4+8+18 4+9+17 4+10+16 4+11+15 4+12+14 5+25 5+6+19 5+6+7+12 5+6+8+11 5+6+9+10 5+7+18 5+7+8+10 5+8+17 5+9+16 5+10+15 5+11+14 5+12+13 6+24 6+7+17 6+7+8+9 6+8+16 6+9+15 6+10+14 6+11+13 7+23 7+8+15 7+9+14 7+10+13 7+11+12 8+22 8+9+13 8+10+12 9+21 9+10+11 10+20 11+19 12+18 13+17 14+16 =>DONE...
发表评论
-
泛型<T>的转换问题
2011-04-28 15:03 2在问答里提问,没有得到答案,特开此贴讨论。 代码如下: ... -
fibonacci的几种实现及尾递归
2011-03-27 22:55 3844/** * java version "1. ... -
自然数m的立方可写成m个连续奇数之和
2010-10-22 09:49 4485题目: 任何一个自然数m的立方均可写成m个连续奇数之和。 例如 ... -
使用内部类实现多重继承
2010-09-07 19:10 1150最常见的实现多重继承的方式,是implements inter ... -
怎么捕获webwork下载文件时的异常
2010-08-09 17:02 1050使用webwork的文件下载方式,action配置如下: ... -
java.rmi.UnmarshalException: invalid method hash
2010-07-30 16:25 4119今天在应用程序中报了下面异常: java.rmi.Serv ... -
转:java 获取ftp文件大小
2010-07-30 11:46 9903【注】:本代码摘自 http://www.java2s.com ... -
判断字符串是否是数字
2010-03-13 14:47 1075看到一笔试题,如题; 《c程序设计语言》第二版5.2节里有ge ... -
练习:生产者-消费者
2010-03-03 14:50 991关于Object.wait()和Object.notify() ... -
三线程顺序打印N次ABC
2010-02-27 15:17 3093记得前一阵子JE上讨论线程顺序打印的面试题,现在有空也练练。 ... -
求数组的平衡点
2010-02-27 14:47 2089原文见:http://www.iteye.com/topic/ ... -
怎么记忆Thread.join()
2010-02-23 16:57 2624Thread.join() JDK_API:等待该线程终止。 ... -
海螺式初始化二维数组
2009-12-13 22:33 1490原题见:http://www.iteye.com/topic/ ... -
初涉java多线程(二)
2009-12-04 23:10 983原文:http://huagenli.iteye.com/bl ... -
Collection’modifiers seem not correct when reflect
2009-12-03 22:48 1033做练习的时候就抄了如下方法 public static v ... -
对private static 实例变量同步,线程获得的是什么锁?
2009-11-29 11:01 1203初学线程,还是比较愚的。 问题如题,就是在方法中加了synch ... -
初涉java多线程(一)
2009-11-23 22:14 936十一期间看了一点java多 ... -
new StringBuilder() VS new StringBuilder(arg)
2009-09-30 17:35 1341StringBuilder,非线程安全 ... -
一种截取字母汉字混合串的方法(String.getBytes)
2009-08-09 21:37 2142/** * 按字节截取字符串 * @para ... -
一种截取字母汉字混合串的方法(String.split)
2009-08-08 23:28 1669/** * 按字节截取字符串 * @ ...
相关推荐
编写一个程序。要求将一个自然数拆分成任意个自然数相加,要求这几个数的乘积是最大的 自然数n拆分成m个自然数,要求这几个数的乘积是最大的,必为n/m及其临近数.
接下来是自然数拆分问题,这是一个更复杂的问题,因为每个自然数n可以被拆分为多个小于n的自然数之和,且这些数是有序的。为了解决这个问题,引入了辅助变量q(n, m),表示将n拆分为不超过m的加数的拆分数。递归关系...
**自然数的拆分**指的是任何一个大于1的自然数\( N \),都可以被表示为若干个自然数之和,并且存在多种不同的拆分方式。例如,数字5可以被拆分为: - \( 5 = 1 + 1 + 1 + 1 + 1 \) - \( 5 = 1 + 1 + 1 + 2 \) - \( ...
一个自然数拆分成N个自然数之和的所有情况
c++ 实现一个自然数表示成几个自然数的和,输出所有自然数和的表示方式
在本项目中,“CUDA程序并行实现一个自然数是否为素数的判断”是通过CUDA技术在Linux环境下对自然数进行高效素数检测的实现。下面将详细讲解相关知识点。 1. **CUDA编程模型** CUDA编程模型允许开发者直接编写C/...
根据给定文件的信息,本文将深入探讨如何使用回溯法来输出自然数1到n的所有不重复排列(即n的全排列)。同时,还将提供一个Java实现的具体示例。 ### 回溯法简介 回溯法是一种通过尝试解决离散和组合问题的方法,...
输入一个自然数n,求1~n之间的所有自然数之和。
f(n, k) = f(n, k-1) + f(n-k, k),这表示 n 可以分为 k 个正整数的和,要么是 n 由前 k-1 个正整数组成,最后一个为 n-(k-1),要么是 n-k 由 k 个正整数组成,第一个为 k。 在给定的内容中,还提到了一些特定情况...
SF1.4-自然数拆分.cpp
具体而言,对于给定的正整数指数α和n,求和式Sn(α)表示为n的α次幂之和。这一概念历史悠久,早在古希腊时期,数学家如阿基米德就开始研究相关的数学问题。幂和问题是数学领域的一个经典问题,它在数学分析、数论、...
在VB(Visual Basic)编程语言中,计算两个或多个自然数的最大公约数(Greatest Common Divisor, GCD)是一项常见的任务。VB 提供了基本的数学运算和控制结构,可以方便地实现这个功能。本篇文章将深入探讨如何在VB...
属于课程实例,输出一个自然数的各项因子。
(2) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半; (3) 按此规则进行处理,直到不能再添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6 个元素。 注意半数集是多重集...
最优分解问题是一个经典的数学优化问题,它涉及到如何有效地将一个正整数n分解为若干个互不相同的自然数之和,以使得这些自然数的乘积最大化。这个问题在计算机科学和算法设计中有着广泛的应用,特别是在寻找高效...
本题是一道经典的查找问题,涉及到的数据规模为:科研调查中获得了一系列的自然数(总数为n),这些数字都不超过1500000000,并且不同的数字不会超过10000个。题目要求在这些数字中查找特定的自然数x,如果找到了,...
设计一个算法,将一个结点值自然数的单链表拆分为两个单链表,原表中保留值为偶数的结点,而值为奇数的结点按它们在原表中的相对次序组成一个新的单链表。
输出每个累加和等于 N 的连续的自然数段的第一个数和最后一个数,两数之间用符号~隔开,每段一行,所有行按每行的第一个数从小到大升序排列。如果没有符合条件的自然数段,则输出None。 输入:N(例如:N=10000) ...
C语言程序设计-求一个n位自然数的各位数字的积;(n 是小于10的自然数).c
对任意给定的一个自然数n,将分母小于等于n的不可约的真分数按升序排列,并且在第一个分数之前加上0/1,在最后一个分数之后加上1/1,这个序列称为n级法雷数列,以Fn表示。如F5为:0/1,1/5, 1/4, 1/3, 2/5, 1/2, 3/5,...