蓝桥杯 奇怪的分式

博客介绍了两种解法。解法1巧妙避开分子除以分母是循环小数的问题,采用交叉相乘,可用int而非double;解法2提到10e - 10为误差值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

解法1:

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

巧妙避开了分子除以分母是循环小数的问题,使用交叉相乘,就可以用int而不需要用double

解法2:

public class Main {

	public static void main(String[] args) {
		double w = 10e-10;
		int count = 0;
		for (double a = 1; a <= 9; a++) {
			for (double b = 1; b <= 9; b++) {
				for (double c = 1; c <= 9; c++) {
					for (double d = 1; d <= 9; d++) {
						if (a != b && c != d) {
							if (Math.abs(((a * c) / (b * d)) - ((a * 10 + c) / (b * 10 + d))) < w) {
								count++;
							}
						}
					}
				}
			}
		}
		System.out.println(count);
	}
}

w:10e-10是误差值(10e-10是10*10的-10次方的意思)

<think>好的,用户提到在C++中处理分式时遇到奇怪的行为,需要解决方案。首先,我需要明确分式处理常见的问题有哪些。可能包括整数除法的截断、溢出、符号处理错误,或者逻辑错误导致的分母为零等情况。 根据引用[2],当数值超过long long范围时,需要使用高精度计算。如果用户的问题涉及大数分式,可能需要检查是否因为数据范围超出预期导致错误。例如,分子或分母过大导致溢出,从而出现意外结果。 另外,引用[4]提到递归与递推的应用,这可能与分式的递归计算有关。如果用户的分式处理涉及递归算法,可能需要注意递归终止条件或中间步骤是否正确,避免无限递归或错误累积。 接下来,考虑常见的分式处理问题。例如,整数除法直接截断的问题,比如5/3在C++中结果为1,而不是分数形式。如果用户期望保留分数形式,可能需要使用结构体或类来存储分子和分母,并实现运算符重载进行运算。 还要考虑运算符优先级的问题,比如表达式中的括号是否正确,导致运算顺序错误。例如,a + b / c可能被误认为(a + b)/c,从而引发错误结果。 另外,分母为零的情况需要处理,否则会导致运行时错误。需要检查代码中是否有未处理的除零异常。 此外,符号问题也很重要。分子和分母的符号处理不当可能导致结果符号错误。例如,分式化简时,通常将符号统一到分子,分母保持正数。 可能用户的分式类在约分时没有正确处理最大公约数,导致结果未化简或错误。例如,使用欧几里得算法计算GCD时,如果处理负数可能出错,或者未在每次运算后及时约分,导致中间结果溢出。 此外,隐式类型转换也可能导致问题。比如,将分式类转换为浮点数时精度丢失,或者在混合类型运算中未正确转换类型,导致结果不符合预期。 最后,需要检查代码是否正确地处理了所有边界情况,例如分子为零时分母不为零,或者分式的表示是否最简形式。如果用户的分式类在运算后没有进行约分,可能会导致后续运算错误或溢出。 综合以上可能的问题,解决方案应包括使用分式类正确管理分子分母,处理运算符重载和约分,检查除零错误,以及验证运算顺序和类型转换。同时,参考高精度计算处理大数问题,并确保递归或递推逻辑正确。</think>### C++分式处理异常分析与解决方案 #### 一、常见分式处理异常场景 1. **整数除法截断** ```cpp int a=5,b=3; double result = a/b; // 结果为1.0而不是1.666... ``` 解决方法:强制类型转换 ```cpp double result = static_cast<double>(a)/b; ``` 2. **分母为零异常** ```cpp int denominator = 0; double value = numerator/denominator; // 触发浮点异常 ``` 解决方法:添加保护判断 ```cpp if (denominator == 0) throw std::runtime_error("Division by zero"); ``` 3. **溢出问题** ```cpp int a=2147483647, b=2; int c = a * b; // 发生整数溢出 ``` 解决方法:使用大整数类型 ```cpp #include <cstdint> int64_t c = static_cast<int64_t>(a)*b; ``` #### 二、分式类设计建议 ```cpp class Fraction { private: int numerator; int denominator; void simplify() { int gcd = std::gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; if(denominator < 0) { // 保证分母始终为正 numerator *= -1; denominator *= -1; } } public: Fraction(int num, int denom) : numerator(num), denominator(denom) { if(denom == 0) throw std::invalid_argument("Denominator cannot be zero"); simplify(); } Fraction operator+(const Fraction& other) const { int new_num = numerator*other.denominator + other.numerator*denominator; int new_den = denominator * other.denominator; return Fraction(new_num, new_den); } // 其他运算符重载... }; ``` #### 三、调试技巧 1. **打印中间结果** ```cpp cout << "当前分子:" << numerator << " 分母:" << denominator << endl; ``` 2. **单元测试用例** ```cpp void testAddition() { Fraction f1(1,2), f2(1,3); assert(f1+f2 == Fraction(5,6)); } ``` 3. **使用Valgrind检测内存错误** ```bash valgrind --leak-check=full ./your_program ``` #### 四、高阶问题解决方案 当处理极大数值时,可结合引用[2]提到的高精度算法: ```cpp #include <boost/multiprecision/cpp_int.hpp> using BigInt = boost::multiprecision::cpp_int; class BigFraction { BigInt numerator; BigInt denominator; // 其余实现与普通分式类类似 }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值