[蓝桥杯][java]埃及分数解法
2014-11-30 23:08
253 查看
import java.util.Scanner;
/*
*
标题:埃及分数
古埃及曾经创造出灿烂的人类文明,他们的分数表示却很令人不解。古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式。
这里,a 和 b 必须是不同的两个整数,分子必须为 1
比如,2/15 一共有 4 种不同的分解法(姑且称为埃及分解法):
1/8 + 1/120
1/9 + 1/45
1/10 + 1/30
1/12 + 1/20
那么, 2/45 一共有多少个不同的埃及分解呢(满足加法交换律的算同种分解)? 请直接提交该整数(千万不要提交详细的分解式!)。
[思路]
由于埃及分数都是以1为分子的,因此,假设最初的分数为A/B,那么如果A能够整除B,则埃及数为1/(B/A)
如果不能够整除时,能够从其中分离出来的最大的分子为1的分数就是1/((A/B)+1)
以2/7为例,能够从中分离出来的最大的分子为1的数是1/(7/2+1) = 1/4
分离出此数之后,再计算出剩下的余数,重复进行以上的判断即可
[算法]
1. 要求用户输入分子a,分母b
2. 判断a是否能够整除b
是: 将a置为1,b置为b/a
3. 判断a是否为1
是:
直接输出a/b, 退出循环
否:
得到小于它的最大的埃及分数的分母 C = A / B + 1
得到余数的分子: A*C-B
得到余数的分母: B*C
4. 返回2继续循环
[运行结果]
请输入一个分数的分子
2
请输入一个分数的分母
45
2/45=1/23+1/1035
可分解为埃及数的个数为: 2
* */
public class EmptyNumber {
public static void main(String[] args) {
/*读入用户输入的分子与分母*/
System.out.println("请输入一个分数的分子");
Scanner scanner = new Scanner(System.in);
int fenZi = scanner.nextInt();
System.out.println("请输入一个分数的分母");
scanner = new Scanner(System.in);
int fenMu = scanner.nextInt();
/*设置埃及数的计数器*/
int total = 0;
System.out.print(fenZi+"/"+fenMu+"=");
while(true){
/*如果分子能够整除分母,则对原分数进行约分 , 保持分子为1*/
if(fenMu%fenZi==0)
{ fenMu = fenMu / fenZi;fenZi = 1;}
/*分子为1时,直接输出结果,中止循环*/
if(fenZi==1)
{
System.out.print(fenZi+"/"+fenMu);
total++;
break;
}
else
{
/*保留原有的分子与分母的值*/
int m = fenMu;
int z = fenZi;
/*得到比当前分数小的最大埃及分数的分母,并输出找到的最大埃及数*/
int num = fenMu / fenZi + 1;
System.out.print(1+"/"+num+"+");
total++;
/*得到余数的分子与分母,继续循环*/
fenMu = m * num;
fenZi = z*num - m;
}
}
System.out.println();
System.out.println("可分解为埃及数的个数为: "+total);
}
}
/*
*
标题:埃及分数
古埃及曾经创造出灿烂的人类文明,他们的分数表示却很令人不解。古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式。
这里,a 和 b 必须是不同的两个整数,分子必须为 1
比如,2/15 一共有 4 种不同的分解法(姑且称为埃及分解法):
1/8 + 1/120
1/9 + 1/45
1/10 + 1/30
1/12 + 1/20
那么, 2/45 一共有多少个不同的埃及分解呢(满足加法交换律的算同种分解)? 请直接提交该整数(千万不要提交详细的分解式!)。
[思路]
由于埃及分数都是以1为分子的,因此,假设最初的分数为A/B,那么如果A能够整除B,则埃及数为1/(B/A)
如果不能够整除时,能够从其中分离出来的最大的分子为1的分数就是1/((A/B)+1)
以2/7为例,能够从中分离出来的最大的分子为1的数是1/(7/2+1) = 1/4
分离出此数之后,再计算出剩下的余数,重复进行以上的判断即可
[算法]
1. 要求用户输入分子a,分母b
2. 判断a是否能够整除b
是: 将a置为1,b置为b/a
3. 判断a是否为1
是:
直接输出a/b, 退出循环
否:
得到小于它的最大的埃及分数的分母 C = A / B + 1
得到余数的分子: A*C-B
得到余数的分母: B*C
4. 返回2继续循环
[运行结果]
请输入一个分数的分子
2
请输入一个分数的分母
45
2/45=1/23+1/1035
可分解为埃及数的个数为: 2
* */
public class EmptyNumber {
public static void main(String[] args) {
/*读入用户输入的分子与分母*/
System.out.println("请输入一个分数的分子");
Scanner scanner = new Scanner(System.in);
int fenZi = scanner.nextInt();
System.out.println("请输入一个分数的分母");
scanner = new Scanner(System.in);
int fenMu = scanner.nextInt();
/*设置埃及数的计数器*/
int total = 0;
System.out.print(fenZi+"/"+fenMu+"=");
while(true){
/*如果分子能够整除分母,则对原分数进行约分 , 保持分子为1*/
if(fenMu%fenZi==0)
{ fenMu = fenMu / fenZi;fenZi = 1;}
/*分子为1时,直接输出结果,中止循环*/
if(fenZi==1)
{
System.out.print(fenZi+"/"+fenMu);
total++;
break;
}
else
{
/*保留原有的分子与分母的值*/
int m = fenMu;
int z = fenZi;
/*得到比当前分数小的最大埃及分数的分母,并输出找到的最大埃及数*/
int num = fenMu / fenZi + 1;
System.out.print(1+"/"+num+"+");
total++;
/*得到余数的分子与分母,继续循环*/
fenMu = m * num;
fenZi = z*num - m;
}
}
System.out.println();
System.out.println("可分解为埃及数的个数为: "+total);
}
}
相关文章推荐
- 蓝桥杯2013-java带分数
- 【算法学习笔记】17.暴力求解法05 隐式图搜索1 迭代加深搜索 埃及分数
- 蓝桥杯-无穷分数-java
- 蓝桥杯之高斯日记java快速解法
- 蓝桥杯第五届省赛JAVA真题----单位分数
- 黄金连分数 -第四届蓝桥杯java B组
- 第六届蓝桥杯省赛Java语言C组_无穷分数
- 第四届蓝桥杯软件类国赛真题-C-A-3_埃及分数
- Java 蓝桥杯第五届 第5题 九数组分数
- 【算法学习笔记】17.暴力求解法05 隐式图搜索1 迭代加深搜索 埃及分数
- 蓝桥杯 埃及分数
- 蓝桥杯+埃及分数
- 第五届蓝桥杯Java语言C组_单位分数
- 蓝桥杯 黄金连分数(java题解)
- [JAVA][2013蓝桥杯预赛 JAVA本科B组][黄金连分数]
- 蓝桥杯 带分数 (JAVA版)
- 蓝桥杯 黄金连分数(java题解)
- 【蓝桥杯】【埃及分数】
- 蓝桥杯 PREV-3 历届试题 带分数 Java版
- 第五届蓝桥杯兰顿蚂蚁java解法