第1关 :设计算法求解整数的划分问题,对给定的整数,输出划分数,并思考如何实现输出每个具体的划分。
任务描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。
对给定的整数,输出对应的划分数。
相关知识
递归
分治
测试输入:
5
预期输出:
7
测试输入:
6
预期输出:
11
提示:
对于样例一,可以划分的情况是:
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
故可以划分为7种
代码:
#include<stdio.h>
int partition(int n,int m){
if(m==0){
return 0;
}
if(n<m){
return partition(n,n);
}
if(n==m){
return partition(n,m-1)+1;
}
if(n>m){
return partition(n-m,m)+partition(n,m-1);
}
}
int main(){
int n;
scanf("%d",&n);
printf("%d",partition(n,n));
}
第2关:有重复元素的排列问题
任务描述
设集合R={r1,r2,…,rn}是要进行排列的n个元素,其中r1,r2,…,rn可能相同。
试着设计一个算法,列出R的所有不同排列。
即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。
输入描述
第1行是元素个数n,1<=n<=500。接下来的1行是待排列的n个元素,元素中间不要加空格。
输出格式
程序运行结束时,将计算输出n个元素的所有不同排列。最后1行中的数是排列总数。
测试说明
平台会对你编写的代码进行测试:
测试输入:
4
aacc
预期输出:
aacc
acac
acca
caac
caca
ccaa
6
代码:
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
void Swap(char &a, char &b) {