yangzhixiaohuli 发表于 2023-11-12 18:57:21

求助一下

本题要求编写程序,计算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++怎么做

isdkz 发表于 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;
}

Mike_python小 发表于 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;
}


这段代码首先定义了有理数结构体,然后实现了求最大公约数、计算有理数和、将字符串转换为有理数以及计算有理数平均值的函数。在主函数中,根据输入格式读取数据,并输出最终结果。

liuhongrun2022 发表于 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 函数。
页: [1]
查看完整版本: 求助一下