蓝桥杯JAVA语言B组_奇怪的分式

探讨一种特殊的分式乘法规则,即分子与分母直接拼接而非常规相乘的方法,并找出所有符合该规则的不同算式的数量。

标题:奇怪的分式

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

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



答案:14

解析:先for循环出来那几个数字,然后用乘机比较,避开浮点运算。

public class F_Six {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int sum=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)continue;
							int m = 10*a+c;
							int n = 10*b+d;
							if(a*c*n == b*d*m)
							{
								sum++;
								System.out.println(a+" / "+b+" + "+c+" / "+d);
							}
					}
		System.out.println(sum);
	}

}


### 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、付费专栏及课程。

余额充值