鱼C论坛

 找回密码
 立即注册
查看: 1022|回复: 3

[已解决]求助一下

[复制链接]
发表于 2023-11-12 18:57:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本题要求编写程序,计算N个有理数的平均值。

输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。

输出格式:
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。

输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1

这题用C或者C++怎么做
最佳答案
2023-11-12 18:57:26
#include <iostream>
#include <sstream>
#include <numeric>

int main() {
    int N;
    std::cin >> N;
    std::string input;
    std::getline(std::cin, input); // 读取换行符
    std::getline(std::cin, input);
    std::istringstream iss(input);
    int sum_numer = 0, sum_denom = 1;
    char slash;
    for (int i = 0; i < N; ++i) {
        int numer, denom;
        iss >> numer >> slash >> denom;
        int gcd = std::gcd(denom, sum_denom);
        sum_numer = sum_numer * denom / gcd + numer * sum_denom / gcd;
        sum_denom *= denom / gcd;
        gcd = std::gcd(sum_numer, sum_denom);
        sum_numer /= gcd;
        sum_denom /= gcd;
    }
    if (sum_denom == 1) {
        std::cout << sum_numer << std::endl;
    } else {
        std::cout << sum_numer << '/' << sum_denom << std::endl;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-12 18:57:26 | 显示全部楼层    本楼为最佳答案   
#include <iostream>
#include <sstream>
#include <numeric>

int main() {
    int N;
    std::cin >> N;
    std::string input;
    std::getline(std::cin, input); // 读取换行符
    std::getline(std::cin, input);
    std::istringstream iss(input);
    int sum_numer = 0, sum_denom = 1;
    char slash;
    for (int i = 0; i < N; ++i) {
        int numer, denom;
        iss >> numer >> slash >> denom;
        int gcd = std::gcd(denom, sum_denom);
        sum_numer = sum_numer * denom / gcd + numer * sum_denom / gcd;
        sum_denom *= denom / gcd;
        gcd = std::gcd(sum_numer, sum_denom);
        sum_numer /= gcd;
        sum_denom /= gcd;
    }
    if (sum_denom == 1) {
        std::cout << sum_numer << std::endl;
    } else {
        std::cout << sum_numer << '/' << sum_denom << std::endl;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-12 18:58:03 | 显示全部楼层
你好,根据题目描述,你可以使用 C 或者 C++ 编程语言来解决这个问题。下面是一个使用 C++ 的示例代码:
#include <iostream>#include <sstream>#include <vector>#include <numeric>using namespace std;// 定义有理数结构体struct Rational {    int numerator; // 分子    int denominator; // 分母};// 求最大公约数int gcd(int a, int b) {    return b == 0 ? a : gcd(b, a % b);}// 计算两个有理数的和Rational addRational(const Rational& r1, const Rational& r2) {    Rational result;    result.numerator = r1.numerator * r2.denominator + r2.numerator * r1.denominator;    result.denominator = r1.denominator * r2.denominator;    // 简化分数    int common = gcd(result.numerator, result.denominator);    result.numerator /= common;    result.denominator /= common;    return result;}// 将字符串转换为有理数Rational parseRational(const string& s) {    istringstream iss(s);    int numerator, denominator;    char slash;    iss >> numerator >> slash >> denominator;    // 处理负数    if (numerator < 0 && denominator < 0) {        numerator = -numerator;        denominator = -denominator;    } else if (denominator < 0) {        numerator = -numerator;        denominator = -denominator;    }    return {numerator, denominator};}// 计算N个有理数的平均值Rational averageRational(const vector<Rational>& numbers) {    Rational sum = {0, 1};    for (const auto& r : numbers) {        sum = addRational(sum, r);    }    sum.numerator = sum.numerator / numbers.size(); // 求平均值    return sum;}int main() {    int N;    cin >> N;    cin.ignore(); // 忽略换行符    string input;    getline(cin, input);    istringstream iss(input);    vector<Rational> numbers;    for (int i = 0; i < N; i++) {        string rationalStr;        iss >> rationalStr;        numbers.push_back(parseRational(rationalStr));    }    Rational avg = averageRational(numbers);    if (avg.denominator == 1) {        cout << avg.numerator << endl;    } else {        cout << avg.numerator << "/" << avg.denominator << endl;    }    return 0;}
这段代码首先定义了有理数结构体,然后实现了求最大公约数、计算有理数和、将字符串转换为有理数以及计算有理数平均值的函数。在主函数中,根据输入格式读取数据,并输出最终结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-12 20:04:23 | 显示全部楼层
这一问题需要分析出输入的有理数,将它们相加,然后除以有理数的数量,得到平均值。在 C++ 中,可以使用 std 库的 gcd 函数来简化分数。

以下是一个可能的 C++ 解决方案:

#include <iostream>#include <numeric>using namespace std;struct Fraction {    long long numerator, denominator;        Fraction() : numerator(0), denominator(1) {}        Fraction(long long n, long long d) : numerator(n), denominator(d) {        simplify();    }        void simplify() {        if (denominator < 0) {            numerator = -numerator;            denominator = -denominator;        }        int g = gcd(numerator, denominator);        numerator /= g;        denominator /= g;    }        Fraction operator+(const Fraction& rhs) const {        long long n = numerator * rhs.denominator + denominator * rhs.numerator;        long long d = denominator * rhs.denominator;        return Fraction(n, d);    }        Fraction operator/(int rhs) const {        return Fraction(numerator, denominator * rhs);    }};istream& operator>>(istream& in, Fraction& f) {    in >> f.numerator;    in.ignore();  // 忽略 '/'    in >> f.denominator;    f.simplify();    return in;}ostream& operator<<(ostream& out, const Fraction& f) {    if (f.denominator == 1) {        out << f.numerator;    } else {        out << f.numerator << '/' << f.denominator;    }    return out;}int main() {    int N;    cin >> N;        Fraction sum;    for (int i = 0; i < N; ++i) {        Fraction f;        cin >> f;        sum = sum + f;    }    cout << sum / N << endl;        return 0;}


这个程序首先定义了一个 Fraction 结构体,用于表示有理数。Fraction 结构体有一些成员函数,用于简化分数和进行分数的加法和除法。

然后,程序定义了输入流和输出流的操作符重载,以方便地从输入流读取分数和向输出流写入分数。

main 函数中,程序读取输入的有理数数量 N,然后读取每个有理数并加到 sum 中。最后,输出 sum / N 的结果。

注意: std::gcd 函数需要 C++17 或更高版本。如果你的编译器不支持,你需要自己实现 gcd 函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 19:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表