2014 第五届蓝桥杯 06 奇怪的分式(java)

奇怪的分式


上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:

1/4 乘以8/5  小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 
(参见图1.png)老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!对于分子、
分母都是1~9 中的一位数的情况,还有哪些算式可以这样计算呢?请写出所有不同算式的个数(包括题中举例的)。显然,交换分子分母后,例如:4/1 乘以5/8 是满足要求的,这算做不同的算式。

但对于分子分母相同的情况,2/2 乘以3/3 这样的类型太多了,不在计数之列!


注意:

答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。



答案:

14



思路:

    使用枚举依次列举出所有可能的情况,对角相乘(1*8*45=4*5*18)



代码:

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		int cnt = 0;
		for(int a=1;a<10;a++){
			for(int b=1;b<10;b++){
				for(int c=1;c<10;c++){
					for(int d=1;d<10;d++){
						if(a!=b && c!=d && (a*c*(b*10+d)==(b*d*(a*10+c)))){
							cnt++;
						}
					}
				}
			}
		}
		System.out.println(cnt);
	}
}

### Java中与分数运算有关的异常行为或常见问题 在Java编程中,涉及分数运算时可能会遇到多种潜在的问题和陷阱。以下是几个常见的问题及其解释: #### 1. **边界条件处理不当** 当涉及到分数比较或者数值范围判断时,程序员可能忽略了一些细微之处。例如,在条件语句中错误地使用字符串或其他不合适的类型作为比较对象[^1]。 ```java public class Example { public static void main(String[] args) { int score = 95; if (score >= "90") { // 这里会报错,因为无法直接比较int和String System.out.println("好分数!"); } } } ``` 上述代码尝试将`int`类型的变量 `score` 和字符串 `"90"` 进行比较,这会导致编译期错误。正确的做法应该是确保两者均为相同的数据类型后再进行比较。 --- #### 2. **浮点数精度丢失** 由于计算机内部表示浮点数的方式基于IEEE 754标准,某些十进制小数无法被精确存储为二进制形式。因此,在执行分数运算时可能出现意外的结果[^2]。 ```java double a = 0.1 + 0.2; System.out.println(a); // 输出可能是 0.30000000000000004 而不是预期的 0.3 ``` 为了避免此类问题,可以采用BigDecimal类来进行高精度计算。 ```java import java.math.BigDecimal; BigDecimal bdA = new BigDecimal("0.1"); BigDecimal bdB = new BigDecimal("0.2"); BigDecimal result = bdA.add(bdB); System.out.println(result.toString()); // 正确输出 0.3 ``` --- #### 3. **整型除法截断特性** 如果两个整数相除,则结果会被自动向下取整,即使存在余数也不会保留小数部分。 ```java int numerator = 5; int denominator = 2; int quotient = numerator / denominator; // 结果为 2, 不是 2.5 System.out.println(quotient); // 如果希望得到更精确的结果,需转换成浮点数 double doubleQuotient = ((double)numerator) / denominator; // 结果为 2.5 System.out.println(doubleQuotient); ``` 需要注意的是,这种行为可能导致逻辑上的误解,尤其是在设计算法时未充分考虑数据类型的隐式转换情况。 --- #### 4. **零作除数引发 ArithmeticException** 尽管浮点数允许无穷大(Infinity)以及NaN(Not-a-Number)的概念来应对特殊情况下的非法操作,但对于整数而言,任何试图以零作为除数的行为都会抛出`ArithmeticException`例外。 ```java try { int zeroDivisionResult = 10 / 0; // 抛出 ArithmeticException } catch (ArithmeticException e) { System.err.println(e.getMessage()); } // 对于双精度浮点数来说则不会触发同样的异常 double dZeroDivisionResult = 10.0 / 0.0; // 返回 Infinity 或 NaN 取决于具体场景 System.out.println(dZeroDivisionResult); ``` --- #### 5. **表达式的优先级混淆** 复杂的算术表达式容易因括号缺失而导致意料之外的结果。虽然Java遵循严格的运算符优先级规则,但在实际编码过程中仍有可能犯下低级失误[^3]。 ```java int i = 1, j = 2; int k = i+++j; // 等价于 (i++) + j ,最终k等于3,i变为2,j保持不变 System.out.println(k + "," + i + "," + j); ``` 此例子展示了前置自增(`++`)相较于加法具有更高的绑定力,从而改变了整个表达式的含义。 --- ### 总结 以上列举了几种典型的关于Java中分数及相关运算所面临的挑战。通过深入理解这些概念并采取适当措施加以规避,能够显著提升软件质量减少Bug发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值