正整数分解问题.

来源:互联网 发布:查看suse linux版本 编辑:程序博客网 时间:2024/05/16 04:41

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

例如: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);

}

 

以上仅供参考