鱼C论坛

 找回密码
 立即注册
查看: 1445|回复: 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
  1. #include <iostream>
  2. #include <sstream>
  3. #include <numeric>

  4. int main() {
  5.     int N;
  6.     std::cin >> N;
  7.     std::string input;
  8.     std::getline(std::cin, input); // 读取换行符
  9.     std::getline(std::cin, input);
  10.     std::istringstream iss(input);
  11.     int sum_numer = 0, sum_denom = 1;
  12.     char slash;
  13.     for (int i = 0; i < N; ++i) {
  14.         int numer, denom;
  15.         iss >> numer >> slash >> denom;
  16.         int gcd = std::gcd(denom, sum_denom);
  17.         sum_numer = sum_numer * denom / gcd + numer * sum_denom / gcd;
  18.         sum_denom *= denom / gcd;
  19.         gcd = std::gcd(sum_numer, sum_denom);
  20.         sum_numer /= gcd;
  21.         sum_denom /= gcd;
  22.     }
  23.     if (sum_denom == 1) {
  24.         std::cout << sum_numer << std::endl;
  25.     } else {
  26.         std::cout << sum_numer << '/' << sum_denom << std::endl;
  27.     }
  28.     return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  4. int main() {
  5.     int N;
  6.     std::cin >> N;
  7.     std::string input;
  8.     std::getline(std::cin, input); // 读取换行符
  9.     std::getline(std::cin, input);
  10.     std::istringstream iss(input);
  11.     int sum_numer = 0, sum_denom = 1;
  12.     char slash;
  13.     for (int i = 0; i < N; ++i) {
  14.         int numer, denom;
  15.         iss >> numer >> slash >> denom;
  16.         int gcd = std::gcd(denom, sum_denom);
  17.         sum_numer = sum_numer * denom / gcd + numer * sum_denom / gcd;
  18.         sum_denom *= denom / gcd;
  19.         gcd = std::gcd(sum_numer, sum_denom);
  20.         sum_numer /= gcd;
  21.         sum_denom /= gcd;
  22.     }
  23.     if (sum_denom == 1) {
  24.         std::cout << sum_numer << std::endl;
  25.     } else {
  26.         std::cout << sum_numer << '/' << sum_denom << std::endl;
  27.     }
  28.     return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-12 18:58:03 | 显示全部楼层
你好,根据题目描述,你可以使用 C 或者 C++ 编程语言来解决这个问题。下面是一个使用 C++ 的示例代码:
  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>
  4. #include <numeric>
  5. using namespace std;
  6. // 定义有理数结构体
  7. struct Rational {
  8.     int numerator; // 分子
  9.     int denominator; // 分母
  10. };
  11. // 求最大公约数
  12. int gcd(int a, int b) {
  13.     return b == 0 ? a : gcd(b, a % b);
  14. }
  15. // 计算两个有理数的和
  16. Rational addRational(const Rational& r1, const Rational& r2) {
  17.     Rational result;
  18.     result.numerator = r1.numerator * r2.denominator + r2.numerator * r1.denominator;
  19.     result.denominator = r1.denominator * r2.denominator;
  20.     // 简化分数
  21.     int common = gcd(result.numerator, result.denominator);
  22.     result.numerator /= common;
  23.     result.denominator /= common;
  24.     return result;
  25. }
  26. // 将字符串转换为有理数
  27. Rational parseRational(const string& s) {
  28.     istringstream iss(s);
  29.     int numerator, denominator;
  30.     char slash;
  31.     iss >> numerator >> slash >> denominator;
  32.     // 处理负数
  33.     if (numerator < 0 && denominator < 0) {
  34.         numerator = -numerator;
  35.         denominator = -denominator;
  36.     } else if (denominator < 0) {
  37.         numerator = -numerator;
  38.         denominator = -denominator;
  39.     }
  40.     return {numerator, denominator};
  41. }
  42. // 计算N个有理数的平均值
  43. Rational averageRational(const vector<Rational>& numbers) {
  44.     Rational sum = {0, 1};
  45.     for (const auto& r : numbers) {
  46.         sum = addRational(sum, r);
  47.     }
  48.     sum.numerator = sum.numerator / numbers.size(); // 求平均值
  49.     return sum;
  50. }
  51. int main() {
  52.     int N;
  53.     cin >> N;
  54.     cin.ignore(); // 忽略换行符
  55.     string input;
  56.     getline(cin, input);
  57.     istringstream iss(input);
  58.     vector<Rational> numbers;
  59.     for (int i = 0; i < N; i++) {
  60.         string rationalStr;
  61.         iss >> rationalStr;
  62.         numbers.push_back(parseRational(rationalStr));
  63.     }
  64.     Rational avg = averageRational(numbers);
  65.     if (avg.denominator == 1) {
  66.         cout << avg.numerator << endl;
  67.     } else {
  68.         cout << avg.numerator << "/" << avg.denominator << endl;
  69.     }
  70.     return 0;
  71. }
复制代码

这段代码首先定义了有理数结构体,然后实现了求最大公约数、计算有理数和、将字符串转换为有理数以及计算有理数平均值的函数。在主函数中,根据输入格式读取数据,并输出最终结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  1. #include <iostream>
  2. #include <numeric>
  3. using namespace std;
  4. struct Fraction {
  5.     long long numerator, denominator;
  6.    
  7.     Fraction() : numerator(0), denominator(1) {}
  8.    
  9.     Fraction(long long n, long long d) : numerator(n), denominator(d) {
  10.         simplify();
  11.     }
  12.    
  13.     void simplify() {
  14.         if (denominator < 0) {
  15.             numerator = -numerator;
  16.             denominator = -denominator;
  17.         }
  18.         int g = gcd(numerator, denominator);
  19.         numerator /= g;
  20.         denominator /= g;
  21.     }
  22.    
  23.     Fraction operator+(const Fraction& rhs) const {
  24.         long long n = numerator * rhs.denominator + denominator * rhs.numerator;
  25.         long long d = denominator * rhs.denominator;
  26.         return Fraction(n, d);
  27.     }
  28.    
  29.     Fraction operator/(int rhs) const {
  30.         return Fraction(numerator, denominator * rhs);
  31.     }
  32. };
  33. istream& operator>>(istream& in, Fraction& f) {
  34.     in >> f.numerator;
  35.     in.ignore();  // 忽略 '/'
  36.     in >> f.denominator;
  37.     f.simplify();
  38.     return in;
  39. }
  40. ostream& operator<<(ostream& out, const Fraction& f) {
  41.     if (f.denominator == 1) {
  42.         out << f.numerator;
  43.     } else {
  44.         out << f.numerator << '/' << f.denominator;
  45.     }
  46.     return out;
  47. }
  48. int main() {
  49.     int N;
  50.     cin >> N;
  51.    
  52.     Fraction sum;
  53.     for (int i = 0; i < N; ++i) {
  54.         Fraction f;
  55.         cin >> f;
  56.         sum = sum + f;
  57.     }
  58.     cout << sum / N << endl;
  59.    
  60.     return 0;
  61. }
复制代码


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

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

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

注意: std::gcd 函数需要 C++17 或更高版本。如果你的编译器不支持,你需要自己实现 gcd 函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 14:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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