关于整数的划分问题(java)

整数划分问题:一个整数可以划分为几个其他整数的和。例如:n=a1+a2+…+an .
需要注意的是:这里要说的整数划分问题是研究一个整数可以划分为多种形式的其它整数,例如:6可以划分为:
6
5+1
4+2,4+1+1
3+3,3+2+1,3+1+1+1
2+2+2,2+2+1+1,2+1+1+1+1
1+1+1+1+1+1
共11种形式!

对于任意的正整数n,可以表示为一些整数相加的形式,我们可以把n的划分函数p(n)定义为另一种形式q(n,m)。其中,n表示那些相加的整数中最大的那一个加数,m表示那些相加的整数一定不能够大于m。

则q(n,m)一共有以下4种情况:
1、n = 1 或 m = 1时:
此时n表示最大加数,m表示最大加数不能超过的数,在这里都为1,故只有一种表达方式!
2、n > m >1时:
此时最大加数n不能大于m,所以最大的加数也就是m,那么只需要算最大加数为n-m不大于m的划分个数就行了,即q(n-m,m),因为当前函数已经说明了最大加数不能够大于m了,那么递归的下一层函数也要不大于m。因此要返回q(n,m-1)。
3、n < m时,
n就表示最大加数了,所以此时只要看n大小就好了,此时的p(n,m) == p(n,n).
递归返回q(n,n)
4、n = m时,
最大加数为n,第一种情况就是加数为n,剩余的情况则是q(n,n-1),故返回q(n,n-1)
+1

package fourth;
import java.util.Scanner;
		 
public class fifth {
	public static void main(String[] args) {

		System.out.println("请输入被划分的数n,以及最大划分数m:");
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int m = in.nextInt();
		System.out.println(n+"被"+m+"的划分一共有"+f(n,m)+"个。");
	}
	
		public static int f(int n, int m){
			
			if(n==1 || m==1)
			{	
				return 1;
			}else if (n <= 0 || m <= 0) {
				return -1;
			}else if(n>m){	
				return f(n-m,m)+f(n,m-1);
			}else if(n<m){	
				return f(n,n);
			}else {		
				return 1+f(n,n-1);
			}
		}
 
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值