题目
形如: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)
输出分解后的单位分数项,中间用一个空格分开。
每种分解法占用一行,行间的顺序按照分母从小到大排序。
例如,
输入:
4
程序应该输出:
1/2 1/3 1/8 1/24
1/2 1/3 1/9 1/18
1/2 1/3 1/10 1/15
1/2 1/4 1/5 1/20
1/2 1/4 1/6 1/12
再例如,
输入:
5
程序应该输出:
1/2 1/3 1/12 1/21 1/28
1/2 1/4 1/6 1/21 1/28
1/2 1/4 1/7 1/14 1/28
1/2 1/4 1/8 1/12 1/24
1/2 1/4 1/9 1/12 1/18
1/2 1/4 1/10 1/12 1/15
1/2 1/5 1/6 1/12 1/20
1/3 1/4 1/5 1/6 1/20
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms
解题思路
假如1被分为了四项,即1 —->1/2 + 1/3 + 1/9 + 1/18,如何判断1和它是否相等?
因为分数的求解不容易,可以这样转为整数的形式,即判断23918是否等于3918+2918+2318+23*9,
如果相等,则说明1==1/2+1/3+1/9+1/18。
题目中要求
1、最大的分母必须不超过30
2、每种分解法占用一行,行间的顺序按照分母从小到大排序
创建一个数字a,它用于存储每一项的分母,这样就容易判断分母不超过30,且按照从小到大顺序排序输出
---------------------**
import java.util.Scanner;
public class 第六题 {
public static void f(int num,int a[],int k){
if(num==k){
g(a); //判断为1
return; //跳出此次函数
}
for(int i=2;i<30;i++){// 分母最大为30
a[k]=i;
f(num,a,k+1);
}
}
public static void g(int a[]){
int sum=1;
int sum1=1;
int he=0;
//筛选等于,后面大于前面的数
for(int k=0;k<a.length;k++){
for(int l=k+1;l<a.length ;l++){
if(a[k]>=a[l]){
return;
}
}
}
for(int i=0;i<a.length;i++){
// 判断分母数组是否符合要求
// 1/a+1/b+1/c==1
// a*c+b*c+a*b==a*b*c
sum=sum*a[i];
for(int j=0;j<a.length;j++){
if(i==j){
continue;
}
sum1=sum1*a[j]; //单轮积需要n次
}
he=he+sum1;
sum1=1; //sum1需要清0
}
if(sum==he){
print(a);
}
else{
return;
}
}
遍历
public static void print(int a[]){
for(int i=0;i<a.length;i++){
if(i==a.length-1){
System.out.println("1/"+a[i]);
}
else{
System.out.print("1/"+a[i]+" ");
}
}
}
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int num=in.nextInt();
int a[]=new int[num];
int k=0;
f(num,a,k);
}
}
心得
认真努力 挑战自我
分类
递归