正整数分解问题.

任何自然数多可以分解成不同的比它更小的正整数之和.

例如:6的分解.

6;

5    1;

4   2;         4   1   1;

3   3;        3   2   1;            3      1      1      1;

2   4;        2     3      1;        2     2     2;    2    2    1    1;     2    1   1    1    1;

1   1    1    1    1    1;  

如何统计一个正整数的分解问题了.觉得用分治法最好:

由观察可以知道,一个正整数n可以分解为比它小的(n-1),  1;

而(n-1)同样可以当作n继续再分解成比它更小的正整数.

为此得到如下的递归规律:

p(n) = q(n, m)     //m为比n更小的正整数

其中如果:

  1. if(n == 0 || m == 0)     p(n) = 0;
  2. if(n == 1 || m == 1)     p(n) = 1;
  3. if(n < m)           p(n) = q(n , n);
  4. if(n == m)    p(n) = q(n, m) = q(n, m-1) + 1;
  5. 其余:p(n) = q(n, m) = q(n, m-1) + q(n-m, m);     //n次递归后原整数变为n-m了.

 

#include  < stdio.h >
int  disassemble( int  n, int  m)
{
    
if(n < 0 || m < 0)
        
return 0;
    
if(n == 1 || m == 1)
        
return 1;
    
if(n < m)
        
return disassemble( n, n);
    
if(n == m)
        
return disassemble(n, m-1+ 1;
        
return (disassemble(n, m-1)+disassemble(n-m, m));
}


void  main()
{
    
int n, m;
    
int result;
    printf(
"n,m: ");
    scanf(
"%d %d ",&n,&m);
    result 
= disassemble(n, m);
    printf(
"%d ",result);

}

 

以上仅供参考

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值