基于整数类型的C++等效电阻计算问题及优化需求
问题描述
需要计算特定电路的等效电阻Req,输入参数R1、R2、R3、R4均为int类型,要求输出取整后的int类型结果。
此前采用double类型结合ceil函数实现了需求,但希望仅用整数类型完成计算:一方面int类型无法直接使用ceil函数,另一方面直接用int进行等效电阻的分式运算时,极易因数值相乘触发溢出(例如用整数表示毫欧级电阻时,数值会被放大,相乘后超出int的范围)。
原实现代码如下:
#include <iostream> #include <cmath> int main(){ double R1, R2, R3, R4; std::cout << "enter R1: " << std::endl; std::cin >> R1; std::cout << "enter R2: " << std::endl; std::cin >> R2; std::cout << "enter R3: " << std::endl; std::cin >> R3; std::cout << "enter R4: " << std::endl; std::cin >> R4; double R12; R12 = R1 + R2; double R34; R34 = R3 + R4; int Req; Req = ceil((R12*R34)/(R12+R34)); std::cout << "the equivalent resistance is: " << Req << std::endl; return 0; }
纯整数运算解决方案
要实现纯整数运算且避免溢出,可借助**64位整数类型(long long)**存储中间计算值,同时用整数向上取整公式替代ceil函数:
核心思路
- 等效电阻公式:
Req = ceil( (R12 * R34) / (R12 + R34) ),其中R12 = R1+R2,R34 = R3+R4 - 整数向上取整公式:对于正整数
a和b,ceil(a/b) = (a + b - 1) / b,将此公式应用到等效电阻计算中,得到:Req = (R12*R34 + (R12+R34) - 1) / (R12+R34) - 用
long long存储R12、R34及后续乘积、和值,避免32位int的溢出问题。
实现代码
#include <iostream> int main(){ int R1, R2, R3, R4; std::cout << "输入R1: " << std::endl; std::cin >> R1; std::cout << "输入R2: " << std::endl; std::cin >> R2; std::cout << "输入R3: " << std::endl; std::cin >> R3; std::cout << "输入R4: " << std::endl; std::cin >> R4; // 用long long存储中间值,避免溢出 long long R12 = static_cast<long long>(R1) + R2; long long R34 = static_cast<long long>(R3) + R4; long long numerator = R12 * R34; long long denominator = R12 + R34; // 整数向上取整计算 int Req = static_cast<int>( (numerator + denominator - 1) / denominator ); std::cout << "等效电阻为: " << Req << std::endl; return 0; }
说明
- 用
long long作为中间计算类型:即使输入的电阻值(以毫欧为单位的整数)很大,long long的64位存储空间也能容纳乘积结果,避免溢出。 - 整数向上取整公式:完全通过整数运算实现了
ceil的效果,无需依赖浮点类型和cmath库。 - 输入输出均保持
int类型,符合需求。
内容的提问来源于stack exchange,提问作者Emilio
相关产品推荐
相关产品推荐

