1034 有理数四则运算 (20 分)

简介: 1034 有理数四则运算 (20 分)

1034 有理数四则运算 (20 分)

本题要求编写程序,计算 2 个有理数的和、差、积、商。

输入格式:

输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。

输出格式:

分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。

输入样例 1:

2/3 -4/2

输出样例 1:

2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)

输入样例 2:

5/3 0/6

输出样例 2:

1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf

很繁的一个题目,如果正常的计算要分很多类,用到很多if else,,,因为是分数,没有办法直接进行运算,所以想通分后进行运算,

//注:由于时间原因,代码还未完成,只实现了加法。

#include<iostream>
#include<cmath>
#include<string>
using namespace std;
//返回最大公约数。最小公倍数是a1*a2/最大公倍数
long long gcd(long long t1, long long t2) {
  return t2 == 0 ? t1 : gcd(t2, t1 % t2);
};
void print_fs(int z, int fz, int fm);
void calcu(int afz0, int  afm, int bfz0, int bfm, char ch);
int main()
{
  int afz0, afm, bfz0, bfm;
  char ch;
  scanf_s("%d/%d %d/%d", &afz0, &afm, &bfz0, &bfm);
  int az = afz0 / afm;
  int afz = afz0 - az * afm;
  int bz = bfz0 / bfm;
  int bfz = bfz0 - bz * bfm;
  print_fs(az, afz, afm);
  cout << " + ";
  print_fs(bz, bfz, bfm);
  cout << " = ";
  calcu(afz0, afm, bfz0, bfm, '+');
  return 0;
}
 
void print_fs(int z, int fz,int fm) {
  if (z > 0) {
    if (fz > 0)
      printf("%d %d/%d", z, fz ,fm);
    else
      printf("%d", z);
  }
  if (z < 0) {
    if (fz > 0)
      printf("(%d %d/%d)", z, fz, fm);
    else
      printf("(%d)", z);
  }
  if(z==0) {
    if (fz > 0)
      printf("%d/%d", fz, fm);
    if(fz <0)
      printf("(%d/%d)", fz, fm);
    if(fz==0)
      printf("0");
  }
}
 
void calcu(int afz0, int  afm, int bfz0, int bfm,char ch) {
  int gfm = afm * bfm / gcd(afm, bfm);  //公分母
  int afz = afz0 * gfm / afm;
  int bfz = bfz0 * gfm / bfm;
  switch (ch)
  { 
  case '+': {
    int sum_fz = afz + bfz;
    int sum_z = sum_fz / gfm;
    int sum_fz1 = sum_fz -sum_z*gfm;
    print_fs(sum_z, abs(sum_fz1/gcd(sum_fz1,gfm)),abs( gfm/ gcd(sum_fz1, gfm)));
  }
  default:
    break;
  }
}

//我一开始在print_fs用if else 还用错了,后来去掉了else

一开始写成

if(a>0)...

if(a<0)...

else...

开始脑子抽了 以为这个else 就是a==0的时候。 实际上else是和最近的if(a<0)配对,等价于if(a>=0)


下午回来后继续做,然后是部分通过。

以为是长度问题,把int改成long long,还是错误。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
//返回最大公约数。最小公倍数是a1*a2/最大公倍数
long long gcd(long long t1, long long t2) {
  return t2 == 0 ? t1 : gcd(t2, t1 % t2);
};
void print_fs(long long z, long long fz, long long fm);
void calcu(long long afz0, long long  afm, long long bfz0, long long bfm, char ch);
void print_calcu_result(long long az, long long afz, long long afm, long long bz, long long bfz, long long bfm, long long afz0, long long bfz0, char yunsuan);
 
int main()
{
  long long afz0, afm, bfz0, bfm;
  char ch;
  scanf("%lld/%lld %lld/%lld", &afz0, &afm, &bfz0, &bfm);
  long long az = afz0 / afm;
  long long afz = afz0 - az * afm;
  long long bz = bfz0 / bfm;
  long long bfz = bfz0 - bz * bfm;
  print_calcu_result(az, afz, afm, bz, bfz, bfm, afz0, bfz0, '+');
  print_calcu_result(az, afz, afm, bz, bfz, bfm, afz0, bfz0, '-');
  print_calcu_result(az, afz, afm, bz, bfz, bfm, afz0, bfz0, '*');
  print_calcu_result(az, afz, afm, bz, bfz, bfm, afz0, bfz0, '/');
  return 0;
}
 
void print_fs(long long z, long long fz,long long fm) {
  if (z > 0) {
    if (fz > 0)
      printf("%lld %lld/%lld", z, fz ,fm);
    if(fz ==0)
      printf("%lld", z);
  }
  if (z < 0) {
    if (fz > 0)
      printf("(%lld %lld/%lld)", z, fz, abs(fm));
    if(fz==0)
      printf("(%lld)", z);
  }
  if(z==0) {
    if (fz > 0 && fm>0)
      printf("%lld/%lld", fz, fm);
    if (fz > 0 && fm < 0)
      printf("(%lld/%lld)", -fz, -fm);
    if(fz <0)
      printf("(%lld/%lld)", fz, (fm));
    if(fz==0)
      printf("0");
  }
}
 
void calcu(long long afz0, long long  afm, long long bfz0, long long bfm,char ch) {
  long long gfm = afm * bfm / gcd(afm, bfm);  //公分母
  long long afz = afz0 * gfm / afm;
  long long bfz = bfz0 * gfm / bfm;
  switch (ch)
  { 
  case '-': {
    bfz *= -1;
  }
  case '+': {
    long long sum_fz = afz + bfz;
    long long sum_z = sum_fz / gfm;
    long long sum_fz1 = sum_fz -sum_z*gfm;
    print_fs(sum_z, (sum_fz1/gcd(sum_fz1,gfm)),( gfm/ gcd(sum_fz1, gfm)));
    break;
  } 
  case '/': {
    if (bfz == 0) {
      cout << "Inf";
      break;
    }
    else {
      long long t = bfz0;
      bfz0 = bfm;
      bfm = t;
    }
  }
  case '*': {
    long long ji_fz = afz0 * bfz0;
    gfm = afm * bfm;
    long long ji_z = ji_fz / gfm;
    long long ji_fz1 = ji_fz - ji_z * gfm;
    print_fs(ji_z, (ji_fz1 /(gcd(ji_fz1, gfm)) ),( (gfm /(gcd(ji_fz1, gfm))) ));
    break;
  }
 
  default:
    break;
  }
}
 
void print_calcu_result(long long az,long long afz,long long afm,long long bz,long long bfz,long long bfm,long long afz0,long long bfz0,char yunsuan) {
  print_fs(az, afz, afm);
  cout << " "<<yunsuan<<" ";
  print_fs(bz, bfz, bfm);
  cout << " = ";
  calcu(afz0, afm, bfz0, bfm, yunsuan);
  cout << endl;
}


看着这么长,有有些乱,很难找错。

 

把分数做成了一个类,看起来结构就很比较清楚了。

然而还是有两处测试没有通过。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cmath>
using namespace std;
int gcd(int t1, int t2) {
  return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
 
class fenshu {
public:
  int zhengshu;
  int fenzi;
  int zfenzi;
  int fenmu;
public:
  fenshu() :zhengshu(0), fenzi(0), zfenzi(0), fenmu(0) {}
  fenshu(int qzheng, int qfenzi, int qfenmu,int qzfenzi=0) :zhengshu(qzheng), fenzi(qfenzi),
    fenmu(qfenmu),zfenzi(qzfenzi) { }
  //标准形式
  void standard() {
    zhengshu += fenzi / fenmu; //整数部分
    zfenzi = fenzi - zhengshu * fenmu; //真分子
  }
  //输出标准形式
  void print_fs();
  fenshu operator+(fenshu b) {
    int gfm = fenmu * b.fenmu / gcd(fenmu, b.fenmu);  //公分母
    int afz = fenzi * gfm / fenmu;
    int bfz = b.fenzi * gfm / b.fenmu;
    int sum_fz = afz + bfz;
    int sum_z = sum_fz / gfm;
    int sum_fz1 = sum_fz - sum_z * gfm;
    return fenshu(sum_z, (sum_fz1 / gcd(sum_fz1, gfm)), (gfm / gcd(sum_fz1, gfm)), (sum_fz1 / gcd(sum_fz1, gfm)));
  }
  fenshu operator-(fenshu b) {
    fenshu fub = fenshu(b.zhengshu, b.fenzi*-1, b.fenmu);
    return (*this + fub);
  }
  fenshu operator*(fenshu b) {
    int ji_fz = fenzi * b.fenzi;
    int gfm = fenmu * b.fenmu;
    int ji_z = ji_fz / gfm;
    int ji_fz1 = ji_fz - ji_z * gfm;
    return fenshu(ji_z, ji_fz1 / gcd(ji_fz1, gfm), gfm / gcd(ji_fz1, gfm), ji_fz1 / gcd(ji_fz1, gfm));
  }
  fenshu operator/(fenshu b) {
    if (b.fenzi == 0) {
      cout << "Inf";
      return fenshu(1, -1, -1,-1);
    }
    else {
      fenshu t = fenshu(b.zhengshu, b.fenmu, b.fenzi);
      return (*this *t);
    }
  }
};
 
void fenshu::print_fs() {
  if (zhengshu > 0) {
    if (zfenzi > 0)
      printf("%d %d/%d", zhengshu, zfenzi ,fenmu);
    if(zfenzi ==0)
      printf("%d", zhengshu);
  }
  if (zhengshu < 0) {
    if (zfenzi > 0)
      printf("(%d %d/%d)", zhengshu, zfenzi, abs(fenmu));
    if(zfenzi==0)
      printf("(%d)", zhengshu);
  }
  if(zhengshu==0) {
    if (zfenzi > 0 && fenmu>0)
      printf("%d/%d", zfenzi, fenmu);
    if (zfenzi > 0 && fenmu < 0)
      printf("(%d/%d)", -zfenzi, -fenmu);
    if(zfenzi <0)
      printf("(%d/%d)", zfenzi, (fenmu));
    if(zfenzi==0)
      printf("0");
  }
}
 
int main()
{
 
  fenshu a, b;
  char ch;
  scanf("%d/%d %d/%d", &a.fenzi, &a.fenmu, &b.fenzi, &b.fenmu);
 
  a.standard();
  b.standard();
  a.print_fs(); cout << " + "; b.print_fs(); cout << " = "; (a + b).print_fs(); cout << endl;
  a.print_fs(); cout << " - "; b.print_fs(); cout << " = "; (a - b).print_fs(); cout << endl;
  a.print_fs(); cout << " * "; b.print_fs(); cout << " = "; (a * b).print_fs(); cout << endl;
  a.print_fs(); cout << " / "; b.print_fs(); cout << " = "; (a / b).print_fs(); cout << endl;
  return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cmath>
using namespace std;
 
int gcd(int t1, int t2) {
  return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
class fenshu {
public:
  int zhengshu;
  int fenzi;
  int zfenzi;
  int fenmu;
public:
  fenshu() :zhengshu(0), fenzi(0), zfenzi(0), fenmu(0) {}
  fenshu(int qzheng, int qfenzi, int qfenmu,int qzfenzi=0) :zhengshu(qzheng), fenzi(qfenzi),
    fenmu(qfenmu),zfenzi(qzfenzi) { }
  //标准形式
  fenshu standard() {
    int gcdfz_fm = gcd(fenmu, fenzi);
    if (gcdfz_fm != 0) {
    fenzi /= gcdfz_fm;
    fenmu /= gcdfz_fm;
    }
    zhengshu += fenzi / fenmu; //整数部分
    zfenzi = fenzi - zhengshu * fenmu; //真分子
    return fenshu(zhengshu, fenzi, fenmu, zfenzi);
  }
  //输出标准形式
  void print_fs();
  fenshu operator+(fenshu b) {
    int r_fenzi = fenzi * b.fenmu + b.fenzi*fenmu;
    int r_fenmu = fenmu * b.fenmu;
    return fenshu(0,r_fenzi,r_fenmu,0);
  }
  fenshu operator-(fenshu b) {
    b.fenzi *= -1;
    return *this + b;
  }
  fenshu operator*(fenshu b) {
    int ji_fz = fenzi * b.fenzi;
    int gfm = fenmu * b.fenmu;
    return fenshu(0, ji_fz, gfm, 0);
  }
  fenshu operator/(fenshu b) {
    if (b.fenzi == 0) {
      cout << "Inf";
      return fenshu(1, -1, -1,-1);
    }
    else {
      fenshu t = fenshu(b.zhengshu, b.fenmu, b.fenzi);
      return (*this *t);
    }
  }
};
 
void fenshu::print_fs() {
  if (zhengshu > 0) {
    if (zfenzi > 0)
      printf("%d %d/%d", zhengshu, zfenzi ,fenmu);
    if(zfenzi ==0)
      printf("%d", zhengshu);
  }
  if (zhengshu < 0) {
    if (zfenzi > 0)
      printf("(%d %d/%d)", zhengshu, zfenzi, fenmu);
    if(zfenzi==0)
      printf("(%d)", zhengshu);
    if (zfenzi < 0)
      printf("(%d %d/%d)", zhengshu, abs(zfenzi), fenmu);
  }
  if(zhengshu==0) {
    if (zfenzi > 0 )
      printf("%d/%d", zfenzi, fenmu);
    if(zfenzi <0)
      printf("(%d/%d)", zfenzi, (fenmu));
    if(zfenzi==0)
      printf("0");
  }
}
 
int main()
{
  fenshu a, b;
  scanf("%d/%d %d/%d", &a.fenzi, &a.fenmu, &b.fenzi, &b.fenmu);
  a.standard();
  b.standard();
  a.print_fs(); cout << " + "; b.print_fs(); cout << " = "; (a + b).standard().print_fs(); cout << endl;
  a.print_fs(); cout << " - "; b.print_fs(); cout << " = "; (a - b).standard().print_fs(); cout << endl;
  a.print_fs(); cout << " * "; b.print_fs(); cout << " = "; (a * b).standard().print_fs(); cout << endl;
  a.print_fs(); cout << " / "; b.print_fs(); cout << " = "; (a / b).standard().print_fs(); cout << endl;
  return 0;
}
相关文章
|
Web App开发 Linux
只需五步,在Linux安装chrome及chromedriver(CentOS)
只需五步,在Linux安装chrome及chromedriver(CentOS)
5478 1
fbh
|
Web App开发 缓存 Linux
Chrome浏览器强制刷新页面(不使用缓存)
在Chrome浏览器中按下F5或 Ctrl+F5 都没用,Chrome总是会强制使用页面缓存进行刷新,如何不使用页面缓存进行刷新? Chrome官方推荐使用如下快捷键,就可以不使用页面缓存进行刷新 Windows和Linu...
fbh
9488 0
|
Arthas 监控 Java
|
安全 Unix Linux
Xftp 7(FTP/SFTP客户端) V7.0.0107 官方中文免费正式版(附文件+安装教程)
Xftp 7(FTP/SFTP客户端) V7.0.0107 官方中文免费正式版(附文件+安装教程)
10381 0
Xftp 7(FTP/SFTP客户端) V7.0.0107 官方中文免费正式版(附文件+安装教程)
|
9月前
|
JSON 测试技术 语音技术
VITA-1.5: 迈向GPT-4o级实时视频-语音交互
近期,由南京大学和腾讯优图推出的VITA-1.5在魔搭开源。VITA-1.5支持视频,音频,文本输入,以及音频输出。
488 66
|
数据采集 机器学习/深度学习 数据可视化
数据挖掘实战:Python在金融数据分析中的应用案例
Python在金融数据分析中扮演关键角色,用于预测市场趋势和风险管理。本文通过案例展示了使用Python库(如pandas、numpy、matplotlib等)进行数据获取、清洗、分析和建立预测模型,例如计算苹果公司(AAPL)股票的简单移动平均线,以展示基本流程。此示例为更复杂的金融建模奠定了基础。【6月更文挑战第13天】
2696 3
|
C语言
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
pta浙大版《C语言程序设计(第3版)》 习题6-4 使用函数输出指定范围内的Fibonacci数 (20分)
|
数据可视化
8个常见的数据可视化错误以及如何避免它们
本文揭示了8个数据可视化常见错误:误导色彩对比、过多的数据图表、省略基线、误导性标签、错误的可视化方法、不实的因果关系、放大有利数据和滥用3D图形。强调清晰、准确和洞察力的重要性,提醒制作者避免使用过多颜色、一次性展示大量数据、错误图表类型以及展示无关相关性等。正确可视化能有力支持决策,不应牺牲真实性以追求视觉效果。
1248 6
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
334 0
Go语言time库,时间和日期相关的操作方法
L1-056 猜数字
L1-056 猜数字
69 0