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; }