📄 整数划分.txt
字号:
#include "iostream.h"
int q( int n , int m )
{
if( n < 1 || m < 1 )
return 0;
if( n == 1 || m == 1 )
return 1;
if( n < m )
return q( n , n );
if( n == m )
return q( n , m - 1 ) + 1;
return q( n , m - 1 ) + q( n - m , m );
}
void main()
{
cout<<q(6,6)<<endl;
}
#include "iostream.h"
#include "iomanip.h"
#define max 1024
void print( int *map , int len )
{
static int total = 1;
cout<<"划分"<<setw(4)<<total++<<" : ";
for( int i = 0 ; i < len ; i++ )
cout<<setw(5)<<map[i];
cout<<endl;
}
int p( int n , int m , int *map , int len )
{
if( n >= 1 && m == 1 )
{
map[len] = 1;
p( n - 1 , m , map , len+1 );
return 1;
}
else if( n == 0 && m == 1 )
{
print( map , len );
return 1;
}
else if( n == 1 && m > 1 )
{
map[len] = n;
print( map , len + 1 );
return 1;
}
else if( n < m )
{
return p( n , n , map , len );
}
else if( n == m )
{
map[len] = m;
print( map , len + 1 );
return p( n , m - 1 , map , len ) + 1;
}
else
{
map[len] = m;
int s1 = p( n - m , m , map , len + 1 );
int s2 = p( n , m - 1 , map , len );
return s1 + s2;
}
}
void main()
{
int map[max] = { 0 };
int len = 0;
cout<<"total="<<p( 6 , 6 , map , len )<<endl;
}
#include "iostream.h"
int q( int n , int m )
{
if( n < 1 || m < 1 )
return 0;
if( n == 1 || m == 1 )
return 1;
if( n < m )
return q( n , n );
if( n == m )
return q( n , m - 1 ) + 1;
return q( n , m - 1 ) + q( n - m , m );
}
void main()
{
cout<<q(6,6)<<endl;
}
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
// 求划分
//
#include "iostream.h"
#include "iomanip.h"
#define max 1024
void print( int *map , int len )
{
static int total = 1;
cout<<"划分"<<setw(4)<<total++<<" : ";
for( int i = 0 ; i < len ; i++ )
cout<<setw(5)<<map[i];
cout<<endl;
}
int p( int n , int m , int *map , int len )
{
if( n >= 1 && m == 1 )
{
// flag1:
// 当 m=1 时,只有一种分法,n = 1 + 1 + ...
// 与 flag2 合作,可以完成这种分解的输出
map[len] = 1;
p( n - 1 , m , map , len+1 );
return 1;
}
else if( n == 0 && m == 1 )
{
// flag2:
// 配合 flag1 ,完成对 m=1 划分的处理
print( map , len );
return 1;
}
else if( n == 1 && m > 1 )
{
// flag3:
// 当 n=1 时,分解已经完成,进行输出处理
map[len] = n;
print( map , len + 1 );
return 1;
}
else if( n < m )
{
// flag4:
// 由于所处位置的关系,此时及以下情况中的 m , n 都 > 1
return p( n , n , map , len );
}
else if( n == m )
{
// flag5:
// 这种情况下,map 位赋为 m,则可完成一种划分
map[len] = m;
print( map , len + 1 );
// 继续下种情况的处理
return p( n , m - 1 , map , len ) + 1;
}
else
{
// 有两种处理方法
// 方法一:
// 当前 map 位赋为 m , 处理 p( n-m , m )
map[len] = m;
int s1 = p( n - m , m , map , len + 1 );
// 方法二:
int s2 = p( n , m - 1 , map , len );
return s1 + s2;
}
}
void main()
{
int map[max] = { 0 };
int len = 0;
cout<<"total="<<p( 6 , 6 , map , len )<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -