`
skzr.org
  • 浏览: 362858 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

如何找出6个小于33大于0的整数,加起来正好是150

阅读更多

问题:如何找出6个小于33大于0的整数,加起来正好是150

结果:

找出6个小于33大于0的整数,加起来正好是150,可以重复
获取数据组合个数:1515921 耗时:3.986

 

代码: 不重复组合的

	/**
	 * 如何找出6个小于33大于0的整数,加起来正好是150,可以重复,比如[25,25,25,25,25,25],但是不需要考虑顺序
	 * 也就是说[26,24,25,25,25,25]和[24,26,25,25,25,25]是同一个组合
	 */
	public static void main(String[] args) throws IOException {
		long end, start = System.currentTimeMillis();
		List<int[]> ret = find(150, 6);
		TreeSet<int[]> result = new TreeSet<int[]>(new Comparator<int[]>() {//<---去掉重复的数据
			@Override
			public int compare(int[] o1, int[] o2) {
				int len = o1.length > o2.length ? o2.length : o1.length;
				for (int i = 0; i < len; i++) if (o1[i] != o2[i]) return o1[i] - o2[i];
				return o1.length - o2.length;
			}
		});
		for (int[] tmp : ret) {
			Arrays.sort(tmp);//<--组合按照小-->大排列
			result.add(tmp);
		}
		end = System.currentTimeMillis();
		
		File f = new File("/home/skzrorg/number.txt");
		f.createNewFile();
		BufferedWriter writer = new BufferedWriter(new FileWriter(f));
		writer.write("找出6个小于33大于0的整数,加起来正好是150,可以重复\n");
		writer.write("获取数据组合个数:" + result.size() + " 耗时:" + (end - start)/1000.0 + "s\n");
		StringBuffer buf = new StringBuffer();
		for (int[] tmp : result) {
			buf.setLength(0);
			int s = 0;
			for (int i = 0; i < tmp.length; i++) {
				s += tmp[i];
				buf.append(tmp[i]).append(',');
			}
			buf.deleteCharAt(buf.length() - 1).append('\n');
			if (tmp.length != 6 || s != 150) {
				writer.write("一个错误的数据:\n\t");
			}
			writer.write(buf.toString());
		}
		writer.close();
	}
	/**
	 * 找出size个小于33大于0的整数,他们之和为sum,可以重复
	 * @param sum 和数
	 * @param size 整数个数
	 * @return 结果int[]
	 * @author skzr.org(E-mail:skzr.org@gmail.com)
	 */
	private static List<int[]> find(int sum, int size) {
		List<int[]> ret = new ArrayList<int[]>();
		if (size == 1) {
			for (int i = 1; i <= 33; i++) if (sum == i) ret.add(new int[]{i});
		} else {
			for (int i = 1; i <= 33; i++) {//找到一个数据
				if (i < sum) {
					List<int[]> others = find(sum - i, size - 1);//寻找其他数据 
					if (!others.isEmpty()) {//找到其他数据
						for (int[] other : others) {
							int[] tmp = Arrays.copyOf(other, other.length + 1);
							tmp[other.length] = i;
							ret.add(tmp);
						}
					}
				}
			}
		}
		return ret;
	}

 所有的组合的

	/**
	 * 如何找出6个小于33大于0的整数,加起来正好是150,可以重复,比如[25,25,25,25,25,25],但是不需要考虑顺序
 *也就是说[26,24,25,25,25,25]和[24,26,25,25,25,25]是同一个组合
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		long end, start = System.currentTimeMillis();
		List<int[]> ret = find(150, 6);
//		ret.add(new int[]{1,23,32,30,32,32});//<---取消注释用于测试 检测重复是否正常工作
//		ret.add(new int[]{25,25,25,25,25,25});
		Collections.sort(ret, new Comparator<int[]>() {//<---排序和检测重复
			@Override
			public int compare(int[] o1, int[] o2) {
				int len = o1.length > o2.length ? o2.length : o1.length;
				for (int i = 0; i < len; i++) if (o1[i] != o2[i]) return o1[i] - o2[i];
				int ret = o1.length - o2.length;
				if (ret == 0) {
					StringBuffer buf = new StringBuffer();
					for (int i = 0; i < o1.length; i++) {
						buf.append(o1[i]).append(',');
					}
					System.out.println("存在相同的数据:" + buf);
				}
				return ret;
			}
		});
		end = System.currentTimeMillis();
		
		File f = new File("/home/skzrorg/number.txt");
		f.createNewFile();
		BufferedWriter writer = new BufferedWriter(new FileWriter(f));
		writer.write("找出6个小于33大于0的整数,加起来正好是150,可以重复\n");
		writer.write("获取数据组合个数:" + ret.size() + " 耗时:" + (end - start)/1000.0 + "s\n");
		StringBuffer buf = new StringBuffer();
		for (int[] tmp : ret) {
			buf.setLength(0);
			int s = 0;
			for (int i = 0; i < tmp.length; i++) {
				s += tmp[i];
				buf.append(tmp[i]).append(',');
			}
			buf.deleteCharAt(buf.length() - 1).append('\n');
			if (tmp.length != 6 || s != 150) {
				writer.write("一个错误的数据:\n\t");
			}
			writer.write(buf.toString());
		}
		writer.close();
	}
	/**
	 * 找出size个小于33大于0的整数,他们之和为sum,可以重复
	 * @param sum 和数
	 * @param size 整数个数
	 * @return 结果int[]
	 * @author skzr.org(E-mail:skzr.org@gmail.com)
	 */
	private static List<int[]> find(int sum, int size) {
		List<int[]> ret = new ArrayList<int[]>();
		if (size == 1) {
			for (int i = 1; i < 33; i++) if (sum == i) ret.add(new int[]{i});
		} else {
			for (int i = 1; i < 33; i++) {//找到一个数据
				if (i < sum) {
					List<int[]> others = find(sum - i, size - 1);//寻找其他数据 
					if (!others.isEmpty()) {//找到其他数据
						for (int[] other : others) {
							int[] tmp = Arrays.copyOf(other, other.length + 1);
							tmp[other.length] = i;
							ret.add(tmp);
						}
					}
				}
			}
		}
		return ret;
	}
分享到:
评论
1 楼 skzr.org 2009-11-26  
忘记说了,生成的txt文件大小有25.8MB,小心编辑器崩溃^ ^

相关推荐

    给定一个单调递增的整数序列,问某个整数是否在序列中

    在IT领域,尤其是在算法与数据结构的学习和应用中,“给定一个单调递增的整数序列,问某个整数是否在序列中”这个问题是极为常见的。这个问题的核心在于如何高效地在一个已排序的数组中查找特定元素的存在性。解决这...

    顺序栈将一个非负的十进制整数N转换为对应的B进制数。

    - 如果输入的数小于0,则输出错误信息。 - 否则,调用`Transform`函数完成转换,并输出结果。 #### 技术细节分析 - **栈的选择**:由于栈是一种先进后出(FILO)的数据结构,非常适合用于此类数制转换问题。每次...

    wanquanshu.zip_site:www.pudn.com_完全数 解法

    为了提高效率,还可以优化算法,例如,只检查小于或等于目标数平方根的数,因为大于平方根的因数必然有一个对应的因数小于或等于平方根。 在压缩包中的文件"2到10000的完全数"很可能是运行结果的输出文件,列出了2...

    51单片机C语言编程基础及实例

    我们通常又将各二极与一个字节的 8 位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7), 相应 8 个发光二极管正好与单片机一个端口 Pn 的 8 个引脚连接,这样单片机就可以通过引脚输出高 低电平控制 8 个...

    用分治法实现元素选择

    在这个特定的问题中,我们要利用分治法来实现“元素选择”,即找出线性序列集中第k小的元素及其位置。下面我们将深入探讨这个过程。 首先,理解问题的关键在于如何有效地比较并排序序列中的元素。分治法的基本步骤...

    Java找出1000以内的所有完数

    2. 不需要检查i的平方根之后的因子:如果i的一个因子大于它的平方根,那么另一个因子一定小于它的平方根。所以,我们只需要计算到i的平方根即可。 优化后的代码可能如下: ```java public class ...

    初一数学试卷.pdf

    7. 大于-1而小于3的整数共有5个。 8. 下列说法正确的是:若两数相等,则这两数的绝对值相等。 9. 冬季某天我国三个城市的最高气温分别是-10°C,1°C,-7°C,把它们从高到低排列正确的是:1°C,-7°C,-10°C。 10...

    PHP把小数转成整数3种方法

    ceil() 函数与floor()正好相反,它用于获取大于或等于指定数值的最小整数值,即对浮点数进行向上取整操作。即使是0.0001这样的小数,也会进位到下一个整数。 - 使用方法:`ceil(value)` - 返回值:返回不小于参数...

    人教版初一数学上册数轴与相反数(提高)巩固练习.doc

    对于长度为2004厘米的线段AB,如果线段的一端正好落在整数点上,那么覆盖的整点个数为2005,如果线段的一端不落在整数点上,那么覆盖的整点个数为2004。 5. **时差与数轴的关系**:可以用数轴来表示不同地方的国际...

    黑盒测试(综合运用所学的黑盒测试方法设计进行测试用例设计)

    边界值分析法通常会选择正好等于、刚刚大于或刚刚小于边界的值来进行测试。 **应用实例**:职工信息登记系统的数据要求,比如编号的范围为1到500,那么边界值应该包括0、1、2、499、500、501等。 #### 三、具体...

    1000以内的完数

    例如,6是第一个完数,因为6的因数有1、2、3,它们相加的和正好是6。在编程领域,理解和找出完数是一个有趣的数学问题,可以用来练习基础的算法和数据结构。 本项目专注于寻找1000以内的完数,并提供了Delphi语言的...

    人教版五年级下册分数的意义与性质知识点及练习题精选.doc

    7. **分数的运算**:涉及到分数的加减乘除,以及分数与整数、小数的转换。例如,将一个苹果平均分成6份,取3份,就是苹果的1/2。 通过上述的讲解和练习题,学生能够深入理解分数的意义,掌握分数的基本性质,并能...

    c++-c++编程基础之leetcode题解第33题搜索旋转排序数组.zip

    如果目标值大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样在这一半的中间元素开始。重复此过程,直到找到目标值,或者搜索范围为空。 2. **处理旋转**:对于旋转数组,我们需要考虑以下...

    青岛版三年级下册数学第一单元测试卷(采访果蔬会——两、三位数除以一位数(二)).docx

    例如,783÷6,7大于6,所以商是三位数。对于715÷8,7小于8,商是两位数,估算时可以将715近似为720,720÷8=90,所以商大约是90。 2. **倍数关系** - 题目中提到75是5的( )倍,75的5倍是( )。理解倍数关系,75...

    苏教版五年级数学上册期末综合测试卷数学知识.doc

    3. **数的组合与读写**:"一个数由 10 个 100,7 个 1、9 个 0.01 和 0.001 组成的数是( )",这里需要理解数位的概念,10个100是1000,7个1是7,9个0.01是0.09,0.001是0.001,所以这个数是1000 + 7 + 0.09 + 0....

    (苏)版小学数学知识点总结.doc

    奇数和偶数则是基于整数除以2的余数来区分的,奇数除以2余1,偶数则正好除尽。 总的来说,苏教版小学数学的知识点覆盖了基本的数学概念和运算规则,旨在帮助学生建立起对数字世界的理解和掌握,为进一步学习更复杂...

    01_18030100101_张帅豪+18030100103_赵宇轩2

    这可以通过遍历字符串并逐个字符减去字符'0'来完成,因为字符'0'到'9'在ASCII码表中的值正好对应0到9的整数。 2. **加法**:在实现加法函数`add`时,我们首先找到两个大整数中位数较多的那个,然后从低位到高位逐位...

    c语言大数相加

    如果大于等于106,则需要进行进位处理,并将当前位的结果调整为个位数。 3. **结果处理与输出** - 在相加完成后,结果数组`c`需要再次反转,以便从高位到低位输出结果。 - 输出结果时,需要注意数组下标是从高位...

    三角形测试程序

    这个程序的核心目标是检查一组边长是否能构成一个合法的几何三角形,根据欧几里得几何中的三角不等式原则:任意两边之和必须大于第三边。通过这样的测试,学习者可以理解基本的条件判断、边界条件处理以及异常管理等...

    二年级数学下册第1单元有余数的除法练习题3无答案苏教版

    - 曾老师的彩带问题:根据给出的选项,可以发现每3条、4条、6条一组都可以正好分完,而每5条、7条、8条、9条一组会有剩余。 - 面粉问题:40袋面粉,每天吃6袋,可以吃6天,还剩4袋。 - 金鱼问题:小刚原来有20条...

Global site tag (gtag.js) - Google Analytics