整数划分

来源:互联网 发布:网络协议大全 编辑:程序博客网 时间:2024/05/16 15:49
#include<iostream>using namespace std;int divide(int n,int m){    if(n<1||m<1){        cout<<" data error"<<endl;    }    else if(n==1||m==1){        return 1;    }   else if(n==m){    return (1+divide(n,n-1));   }   else if(n<m){    return (divide(n,n));   }   else return(divide(n,m-1)+divide(n-m,m));}int main(){    int n;    cin>>n;  cout<< divide(n,n);}

解释:4分成4,3+1,2+2,2+1+1,1+1+1+1,一共5中

用递归的方法实现,求得总数,

0和负数不需要划分,所以当m和n小于1的时候报dataerror

如果m是1,说明分到了1+1+1+1...+1这种情况,这种情况只有1种所以return1

如果n是1,就只有1这一种

n=m的情况是分包含n和不包含n,包含就是只有一种,分4的话就是4,分5的话就是5

不包含n就是比n小1的所有划分,就是

用4为例走一遍,从main开始,divide(4,4)先走m=n那一步,结果是1+divide(4,3),4比3大,走最后一个else,就是divide(4,2)+divide(3,3),

然后是divide(4,1)+divide(3,2)+divide(3,2)+divide(2,3),2<3所以是divide(2,2),就是divide(4,1)+divide(3,2)+divide(3,2)+divide(2,2),

divide(2,2)->1+divide(2,1)

divide(2,1)->divide(1,1)



我自己懵了,我也不知道咋回事了,,。

原创粉丝点击