蓝桥杯 分解单位数

形如:1/a 的分数称为单位分数。

可以把1分解为若干个互不相同的单位分数之和。
例如:
1 = 1/2 + 1/3 + 1/9 + 1/18
1 = 1/2 + 1/3 + 1/10 + 1/15
1 = 1/3 + 1/5 + 1/7 + 1/9 + 1/11 + 1/15 + 1/35 + 1/45 + 1/231
等等,类似这样的分解无穷无尽。

我们增加一个约束条件:最大的分母必须不超过30

请你求出分解为n项时的所有不同分解法。

数据格式要求:

输入一个整数n,表示要分解为n项(n<12)

/*
*设置一个模型,将 a[n]=i 存入的 n对应要接收数字的位置,i表示目前要存放的数字
*暴力枚举,深度搜索,检索出所有的排列可能性
*为了避免发生全排列的重复,存入的数字保证比上一个数字大 1(s=cur?a[cur-1]+1:1)
*注意浮点类型,int *1.0 否则出错 
*/
#include<stdio.h>
#include<string.h>
int n;
int a[30];
void dfs(int cur){
//检查是否放置了n个数字 
if(cur==n){
//初始化和为0.0 
float sum=0.0;
//从第0个位置开始累加,判断是否符合要求 
for(int i1=0;i1<n;i1++){
sum+=1.0/(a[i1]*1.0);
}
if(sum<1.000001 && sum>0.99999)
{
for(int i1=0;i1<n;i1++)
printf("1/%d ",a[i1]);
printf("
");
}
//返回到上一层,不用继续向下搜索 
return;
}
//保证当前开始的数字比上一个数字小于一 
int s=cur?a[cur-1]+1:1;
//从比上一个数字大于1的数字到30进行搜索 
for(int i2=s;i2<=30;i2++){
int ok=1;
for(int j=0;j<cur;j++)
if(a[j]==i2) //如果数字发生重复说明之前放置过该数字 
ok=0;
if(ok){
a[cur]=i2;
dfs(cur+1);    //进行下一步搜索 
}
}
return;
}
int main(){
while(scanf("%d",&n)==1){
memset(a,1,sizeof(a));
dfs(0);
}
return 0;
}
原文地址:https://www.cnblogs.com/sky-z/p/4409893.html