`
j夫子
  • 浏览: 91459 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

分解和为N的所有加数的情况

阅读更多
/**
 * http://zjfhw.iteye.com/blog/2213877
 * 分解和为N的因子
 * 思路:
 * 和为N的因子 必然可以分成N组
 * 比如5
 * 因子数为5的组:1+1+1+1+1
 * 因子数为4的组:1+1+1+1   然后剩余的1 分配给任意一组 2+1+1+1 1+2+1+1 (如果位置不同算为2组的话)
 * 因子数为3的组:1+1+1   剩余2 ,问题变成 如何将2个1 分配给 3个组 
 * ......
 * 
 * 因子数为1的组:5
 */
public class ResolveSum {
	static int[] arr ;
	
	public static void main(String[] args) {
		//要分解的和为10
		int n = 10;
		//将10转化成 一个长度为n的数组 每个元素都为1
		arr =getData(n);
		//分别去求因子个数为i的因子集 i=1~n
		for(int i=1;i<=arr.length;i++){
			resolveSum(1,0,i,arr.length);
			clear(arr);
		}
	}
	/**
	 * 分解
	 * @param index 往第index个位置分发1
	 * @param payd 计数器,已经分发了payd个1
	 * @param group 该组有group个元素
	 * @param N 要分解的和
	 */
	static void resolveSum(int index,int payd,int group,int N){
		//循环着进行分发,覆盖  “n个数分发到m个地方” 的所有情况
		for(int i=payd;i<N-group;i++){
			//首先将第index个位置分发1
			arr[index-1]+=1;
			if(i==N-group-1){
				//当剩余值已经分发完,将该组因子打印出来
				printElement(arr,group);
				//将最后操作的位置还原成1 
				arr[index-1]=1;
			}else{
				//否则开始向index+1的位置进行分发,如果已经超出了该组的因数个数,则不操作
				if(index+1<=group)
				resolveSum(index+1,i+1,group,N);
			}
		}	
		
		
	}
	private static void printElement(int[] arr2, int group) {
		System.out.print(arr2.length+"=");
		for(int i=0;i<group;i++){
			System.out.print(+arr2[i]+ (i==group-1?"":"+"));
		}
		System.out.println("");
			
	}
	
	public static int[] getData(int n){
		int[] data = new int[n];
		for(int i=0;i<data.length;i++){
			data[i] = 1;
		}
		return data;
	}
	
	public static void clear(int[] data){
		for(int i=0;i<data.length;i++){
			data[i] = 1;
		}
	}
}

 

 

结果:(没有考虑 加数一样但位置不同的情况,视具体问题进行修改吧...很简单)

 

10=10

10=2+8

10=3+7

10=4+6

10=5+5

10=6+4

10=7+3

10=8+2

10=9+1

10=2+2+6

10=2+3+5

10=2+4+4

10=2+5+3

10=2+6+2

10=2+7+1

10=3+2+5

10=3+3+4

10=3+4+3

10=3+5+2

10=3+6+1

10=4+2+4

10=4+3+3

10=4+4+2

10=4+5+1

10=5+2+3

10=5+3+2

10=5+4+1

10=6+2+2

10=6+3+1

10=7+2+1

10=8+1+1

10=2+2+2+4

10=2+2+3+3

10=2+2+4+2

10=2+2+5+1

10=2+3+2+3

10=2+3+3+2

10=2+3+4+1

10=2+4+2+2

10=2+4+3+1

10=2+5+2+1

10=2+6+1+1

10=3+2+2+3

10=3+2+3+2

10=3+2+4+1

10=3+3+2+2

10=3+3+3+1

10=3+4+2+1

10=3+5+1+1

10=4+2+2+2

10=4+2+3+1

10=4+3+2+1

10=4+4+1+1

10=5+2+2+1

10=5+3+1+1

10=6+2+1+1

10=7+1+1+1

10=2+2+2+2+2

10=2+2+2+3+1

10=2+2+3+2+1

10=2+2+4+1+1

10=2+3+2+2+1

10=2+3+3+1+1

10=2+4+2+1+1

10=2+5+1+1+1

10=3+2+2+2+1

10=3+2+3+1+1

10=3+3+2+1+1

10=3+4+1+1+1

10=4+2+2+1+1

10=4+3+1+1+1

10=5+2+1+1+1

10=6+1+1+1+1

10=2+2+2+2+1+1

10=2+2+3+1+1+1

10=2+3+2+1+1+1

10=2+4+1+1+1+1

10=3+2+2+1+1+1

10=3+3+1+1+1+1

10=4+2+1+1+1+1

10=5+1+1+1+1+1

10=2+2+2+1+1+1+1

10=2+3+1+1+1+1+1

10=3+2+1+1+1+1+1

10=4+1+1+1+1+1+1

10=2+2+1+1+1+1+1+1

10=3+1+1+1+1+1+1+1

10=2+1+1+1+1+1+1+1+1

 

最后再加上

10=1+1+1+1+1+1+1+1+1+1

0
0
分享到:
评论

相关推荐

    11091 最优自然数分解问题

    而如果整数n可以分解为若干互不相同的加数时,不考虑自身为单独加数的情况,比如4,问题(1)的解输出为3,而非4。 输入格式 只有一个正整数n(1&lt;=n)。 输出格式 输出待解问题(1)和(2)的最大乘积,中间...

    算法分析与设计:贪心算法(自然数加法分解乘积最大+马拉松接力问题+整数删除后取最大值)(C++可执行源码+完整算法分析)

    题目1:设 n 为一自然数,n 可以分解成若干个不同的自然数的和,这样的分法有很多种,比如 n=10, 10 可以分解为:10=5+4+1; 10=5+3+2; 10+9+1; 10=8+2; 10=7+3; 10=6+4;10=7+2+1; 10=6+3+1;…。在所有这些分法中,各...

    西南交通大学算法理论课作业6.rar

    题目 1:设 n 为一自然数,n 可以分解成若干个不同的自然数的和,这样的分法有很多种, 比如 n=10, 10 可以分解为:10=5+4+1; 10=5+3+2; 10+9+1; 10=8+2; 10=7+3; 10=6+4; 10=7+2+1; 10=6+3+1;…。在所有这些分法中...

    上海电机学院C语言实训答案

    说明:输入的第1个数表示学生人数(n=9),接着输入的9个成绩中,累加和为628.5(所有小数均保留一位小数输出),平均分为69.8分;平均分以上(A档)有4人,占44.4%,平均分以下(B档)有5人,占55.6%;A档的最低...

    大整数运算

    而大整数的乘、除和指数运算,可以分解为大整数的加减运算。 2. 大整数的加、减、乘、除和指数运算,一般是在求两大整数在取余操作下的加、减、乘、除和指数运算,即分别求 (a +b) mod n, (a - b) mod n, (a * b) ...

    Java经典编程题(附答案)

    1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且 输入月份大于3时需考虑多加一天。 【程序15】 题目:输入三个整数x,y,z,请把这三个数由小到大输出。 1....

    RSA加密算法实现附源代码

    RSA加密算法实现附源代码, RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )...不管怎样,分解n是最显然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。

    java 经典习题.doc

    1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。 import java.util.Scanner; //题目:输入某年某月某日,判断这一天是这...

    计算机二级公共基础知识

    1. 算法的基本概念 利用计算机算法为计算机解题的过程实际上是在实施某种算法。 (1)算法的基本特征 算法一般具有4个基本特征:可行...对于长度为n的有序线性表,在最坏情况下,二分法查找只需比较log2n次, 二级公共...

    DES数据加密

    如果想产生一系列的随机数字,比如说,在0和列表中所有的随机数之间的一些数,就可以使用下面的方法: int __cdecl mysortproc(void *p1, void *p2) { unsigned long **pp1 = (unsigned long **)p1; ...

    基于c++数字逻辑电子仿真器

    而数组的下标加1就为序号。 所以每次重绘为了方便,将所有序号都重绘。 重绘连接线 void CMyView::LinkLineRedraw(CPoint startpoint, CPoint point) { //将起点startpoint到终点point扩充成一个矩形drawrect ...

    C语言程序设计标准教程

    在主函数中输入n值,并作为实参,在调用时传送给s 函数的形参量n( 注意,本例的形参变量和实参变量的标识符都为n, 但这是两个不同的量,各自的作用域不同)。 在主函数中用printf 语句输出一次n值,这个n值是实参n的...

    定点补码一位乘法器的设计.rar

    讨论当相乘的两个数中有一个或二个为负数的情况,在讨论补码乘法运算时,对被乘数或部分积的处理上与原码乘法有某些类似,差别仅表现在被乘数和部分积的符号位要和数值一起参加运算。 若[Y]补=Y0Y1Y2…Yn 当Y0为1时...

    用C编写班级成绩管理系统

    printf("\n\n\n\n\n\n\n\n\n"); printf(" * * ******* * ***** ***** * * ******* \n"); printf(" * * * * * * * ** * * * \n"); printf(" * * * * ******* * * * * * *** * ******* \n" ); printf(" * * *...

    语言程序设计课后习题答案

    结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。 虽然结构化程序设计方法具有很多的优点,...

    ACM巨全模板 .pdf

    3.线段树模板(模板为区间加法) (线段树染色) (区间最小值) 4.线性基 (求异或第k大) 5.主席树(静态求区间第k小) (区间中小于k的数量和小于k的总和) (区间中第一个大于或等于k的值) 6.权值线段树 (求逆序对) 7.动态...

    java 正则表达式

    "^\d{m,n}$"只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。只能输入非零的正整数:"^\+?[1-9]...

    Excel新增工具集

    合并结果为:总表记录行数为各工作表的记录行数之和,表头列数为各工作表列数之和,并在A列多出一个标志列,标记本条记录来源于哪个工作表。 5、多表(单表)同类数据合并与求和:其效果是:(a)标识列重名的合成一...

Global site tag (gtag.js) - Google Analytics