You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C语言中计算分数的倒数?(物理计算器焦距公式开发场景)

嘿,这个问题我刚好在开发物理工具类程序时遇到过类似场景,给你几个实用的实现思路,适配不同的计算需求:

情况1:处理整数分数形式的倒数

如果你的焦距相关参数是用整数分数存储的(比如输入的物距是3/2这种形式,拆成分子和分母两个整数),那计算倒数的核心就是交换分子分母,同时注意约分和错误处理:

#include <stdio.h>
#include <stdlib.h> // 用于abs函数

// 辅助函数:计算最大公约数(欧几里得算法),用来约分分数
int gcd(int a, int b) {
    a = abs(a);
    b = abs(b);
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 计算分数numerator/denominator的倒数,结果存在out_num和out_den中
// 返回0表示成功,-1表示错误(比如原分数为0)
int get_reciprocal_fraction(int numerator, int denominator, int *out_num, int *out_den) {
    if (numerator == 0) {
        printf("Error: 0没有倒数\n");
        return -1;
    }
    // 交换分子分母
    *out_num = denominator;
    *out_den = numerator;
    // 约分,得到最简分数
    int common_divisor = gcd(*out_num, *out_den);
    *out_num /= common_divisor;
    *out_den /= common_divisor;
    return 0;
}

// 测试示例
int main() {
    int num = 2, den = 3;
    int res_num, res_den;
    if (get_reciprocal_fraction(num, den, &res_num, &res_den) == 0) {
        printf("分数%d/%d的倒数是%d/%d\n", num, den, res_num, res_den);
    }
    return 0;
}
情况2:处理浮点数形式的倒数(物理计算器常用场景)

大多数物理计算中,我们会用浮点数(floatdouble)来存储焦距、物距这类参数,这时计算倒数就更直接,重点是处理除数为0的边界情况:

#include <stdio.h>
#include <math.h> // 用于fabs和isnan

// 用透镜公式计算焦距:1/f = 1/u + 1/v → f = 1/(1/u + 1/v)
double calculate_focal_length(double object_distance, double image_distance) {
    double reciprocal_sum = 1.0 / object_distance + 1.0 / image_distance;
    // 避免除以接近0的数,防止数值溢出或无意义结果
    if (fabs(reciprocal_sum) < 1e-9) {
        printf("Error: 计算结果趋近于0,无法取倒数\n");
        return NAN; // 返回非数值标记错误
    }
    return 1.0 / reciprocal_sum;
}

// 测试示例
int main() {
    double u = 5.0; // 物距5米
    double v = 10.0; // 像距10米
    double focal = calculate_focal_length(u, v);
    if (!isnan(focal)) {
        printf("计算得到的焦距为:%.2f 米\n", focal);
    }
    return 0;
}
额外注意事项
  • 整数溢出问题:如果用整数处理大数值分数,建议把int换成long long类型,避免运算时溢出。
  • 精度控制:浮点数运算会有微小精度误差,如果需要高精度的分数结果,优先用整数分数的方式处理。
  • 边界校验:无论哪种方式,一定要判断除数是否为0(或接近0),否则程序会崩溃或输出错误结果。

内容的提问来源于stack exchange,提问作者Anish Bhat

火山引擎 最新活动