程序员面试题精选(44):整数分割(即求一个数N由小于等于N的数相加所得的所有组合)
2007-12-06 21:31
274 查看
题目描述:比如给定一整数4,其有如下情况:4=4;
4=3+1;
4=2+2;
4=2+1+1;
4=1+1+1+1;
下面便是两种版本的分割实现代码。
#include "stdio.h"
int Compute( int number, int maximum)
{
if (number == 1 || maximum == 1 )
return 1 ;
else if (number < maximum)
return Compute(number, number);
else if (number == maximum)
return 1 + Compute(number, maximum - 1 );
else
return Compute(number, maximum - 1 ) + Compute(number - maximum, maximum);
}
int IntPartionNo( int n)///////////////////求组合总数版本;
{
return Compute(n, n);
}
int IntegerPartition( int n)///////////////求组合总数并打印出所有情况版本;
{
int * partition = new int
();
int * repeat = new int
();
partition[ 1 ] = n;
repeat[ 1 ] = 1 ;
int count = 1 ;
int part = 1 ;
int last, smaller, remainder;
printf( " %3d " , partition[ 1 ]);
do
{
last = (partition[part] == 1 ) ? (repeat[part -- ] + 1 ) : 1 ;
smaller = partition[part] - 1 ;
if (repeat[part] != 1 )
-- repeat[part ++ ];
partition[part] = smaller;
repeat[part] = 1 + last / smaller;
if ((remainder = last % smaller) != 0 )
{
partition[ ++ part] = remainder;
repeat[part] = 1 ;
}
++ count;
printf( " /n " );
for ( int i = 1 ; i <= part; ++ i)
for ( int j = 1 ; j <= repeat[i]; ++ j)
printf( " %3d " , partition[i]);
} while (repeat[part] != n);
if (partition)
{
delete [] partition;
partition = 0 ;
}
if (repeat)
{
delete [] repeat;
repeat = 0 ;
}
return count;
}
int main()
{
printf("%d/n",IntPartionNo(4));
IntegerPartition(4);
getchar();
}
4=3+1;
4=2+2;
4=2+1+1;
4=1+1+1+1;
下面便是两种版本的分割实现代码。
#include "stdio.h"
int Compute( int number, int maximum)
{
if (number == 1 || maximum == 1 )
return 1 ;
else if (number < maximum)
return Compute(number, number);
else if (number == maximum)
return 1 + Compute(number, maximum - 1 );
else
return Compute(number, maximum - 1 ) + Compute(number - maximum, maximum);
}
int IntPartionNo( int n)///////////////////求组合总数版本;
{
return Compute(n, n);
}
int IntegerPartition( int n)///////////////求组合总数并打印出所有情况版本;
{
int * partition = new int
();
int * repeat = new int
();
partition[ 1 ] = n;
repeat[ 1 ] = 1 ;
int count = 1 ;
int part = 1 ;
int last, smaller, remainder;
printf( " %3d " , partition[ 1 ]);
do
{
last = (partition[part] == 1 ) ? (repeat[part -- ] + 1 ) : 1 ;
smaller = partition[part] - 1 ;
if (repeat[part] != 1 )
-- repeat[part ++ ];
partition[part] = smaller;
repeat[part] = 1 + last / smaller;
if ((remainder = last % smaller) != 0 )
{
partition[ ++ part] = remainder;
repeat[part] = 1 ;
}
++ count;
printf( " /n " );
for ( int i = 1 ; i <= part; ++ i)
for ( int j = 1 ; j <= repeat[i]; ++ j)
printf( " %3d " , partition[i]);
} while (repeat[part] != n);
if (partition)
{
delete [] partition;
partition = 0 ;
}
if (repeat)
{
delete [] repeat;
repeat = 0 ;
}
return count;
}
int main()
{
printf("%d/n",IntPartionNo(4));
IntegerPartition(4);
getchar();
}
相关文章推荐
- 输出所有小于等于n(n为一个大于2的正整数)的素数
- 小于等于n的正整数相加等于m的一个算法
- 输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。实际上就是一个背包问题
- 输入一个整数,输出所有相加等于这个数的算式
- 输入一个整数,输出所有相加等于这个数的算式
- 链表分割 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以
- 用户输入一个整数,然后显示所有小于或等于该数的素数!
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 输入任意一个大于2的正整数n,输出所有小于等于n的素数
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 输入一个整数,输出所有相加等于这个数的算式
- 20171207编写一个程序,只接受正整数的输入,然后显示所有小于或等于该数的素数。
- 笔试题:写一个有序整数数组两两之和等于某个数所有组合
- 有一个整数数组,然后有一个数m,要找到整数数组中,所有和等于m的组合,并输出。
- jq 输入一个整数,输出所有相加等于这个数的算式
- 获取一个整数 然后显示所有小于或等于该数的素数
- 一个有序正整数集S,若要保证整数集中所有的数通过组合(相加)可以表示1~N中任意一个正整数
- 有一个整数数组(包括正数 负数 和0),给定一个M值,要求数组中的一个或多个值相加的和等于M,有多少种组合?
- C primer plus 第七章 练习9: 编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。