蓝桥杯 分解单位数
形如: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("\n"); } //返回到上一层,不用继续向下搜索 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; }