针对以下条件的问题
①所求分数小于1,且分子分母均为正整数
②将其拆分成两个自然数的倒数和
③在所有的可能解中,筛出两自然数不相同的情况并输出
例
① ②
在括号中填入不同的自然数,使等式成立
思维和解法
① 参考bilibili 三乐大掌柜的解法
②此为①的变式,可参考①的算法
设计过程
①通过所给分母deno(denominator)获取自然数a,b的可能值,因为a,b均的因数
②依次将所有a,b组合代入原式中,看是否满足条件,即deno+a和deno+b是否整除分子nume(numerator),整除即满足
③将a=b的情况排除
源代码
code:
import java.util.Scanner;
class getSplitFraction {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入分子和分母,且均大于0:");
int nume=sc.nextInt();
int deno=sc.nextInt();
sc.close();
if(nume<=0||deno<=0)
System.out.println("输入出错辣!");
if(nume>deno)
System.out.println("在本课题中分子应小于分母!");
int i,cm;
int k=0;
int j=0;
int p=0;
/*
*构造两个数组分别存放两类因数
*其中num_x用于存放两因数积等于cm的较小数
*num_y用于存放较大数
*/
cm=deno*deno;
//求出cm的因数中小于等于denm的数量k
//并作为新数组的数组大小
for(i=1;i<=deno;i++) {
if(cm%i==0) {
k++;
}
}
int [] num_x=new int [k];
int [] num_y=new int [k];
//存放1到deno内的因数
for(i=1;i<=deno;i++) {
if(cm%i==0) {
num_x[j]=i;
j++;
}
}
//存放与num_x对应的因数
for(i=0;i<k;i++) {
num_y[i]=cm/num_x[i];
}
int x,y;
//判断,并将满足条件的结果输出
for(i=0;i<k;i++) {
if((num_x[i]+deno)%nume==0&&(num_y[i]+deno)%nume==0) {
x=(num_x[i]+deno)/nume;
y=(num_y[i]+deno)/nume;
if(x!=y) {
System.out.println(nume+"/"+deno+"=1/"+x+"+1/"+y);
p++;
}
}
continue;
}
if(p==0) {
System.out.println("该分数无法拆分成两个不同自然数的倒数和!");
}
}
}
运行结果