阿这...从输入ctrl+v这个图片到写出这几句话,又看了若干时间手机= =
先给出我写出的解法吧
#include<iostream>
using namespace std;
#include<cmath>
void huajian(long long& a, long long& b)
{
// 比如 8 6 ;
// 先求最大公约数 2
long long x = a;
long long y = b;
if (x < y)
swap(x, y);
long long z;
while(x%y)
{
z=x%y;
x=y;
y=z;
}
a/=y;
b/=y;
}
void print(long long a, long long b)
{
// 考虑到加减乘除 加: 按那种方式 分母一定不为0 分子为正则为正 分子为负则为负
// 考虑减: 分母一定不为0且为正 分子还是正常 考虑乘 :分母正,分子正常
// 考虑除: 分子分母都有可能为负 若都是负 则为正 若一方为负 则为负 且一方为0则为Inf
// 综上 也就是 加减乘都是看分子 为正则为正 除的话 若一方为负才为负 所以是否带负号还是看相乘的结果
// 现在考虑0: 若打印等号左边的 : 第一个为0则打印0 运算后的:除:若右边为0则为INF
if (!b)
{
cout << "Inf";
return;
}
if (!a)
{
cout << "0";
return;
}
//if (a == 0 || b == 0)
//{
// printf("%s", !b ? "Inf" : "0");
//}
// -4 2
// 下面的也就是ab都不为0
bool prime = ((a < 0 && b > 0) || (a > 0 && b < 0));
if (prime)
printf("(-");
long long x = fabs(a);
long long y = fabs(b);
huajian(x, y);
long long z = x / y;
int flag = 0;
if (z) //z不是0则输出
{
cout << z;
flag = 1; //只有左边输出且右边输出才输出中间的空格
}
x %= y;
if (x&&flag)
printf(" %d/%d", x, y);
else if(x&&!flag)
printf("%d/%d", x, y);
if (prime)
printf(")");
}
int main()
{
long long a, b, c, d;
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
// 2/3 -4/2
print(a, b); printf(" + "); print(c, d); printf(" = "); print(a*d+b*c,b*d); printf("\n");
print(a, b); printf(" - "); print(c, d); printf(" = "); print(a*d-b*c,b*d); printf("\n");
print(a, b); printf(" * "); print(c, d); printf(" = "); print(a*c,b*d); printf("\n");
print(a, b); printf(" / "); print(c, d); printf(" = "); print(a*d,b*c);
return 0;
}
下面这个输出方式是我最开始没想到的,且我都不知道怎么实现这样的两个分数的相加减等等。就很无语。在print函数前几行,是我思考的一些好像没必要思考的东西。我在思考加减乘除的各种情况。最后发现好像没有什么意义= =
1. 注意这个scanf的使用。对于某些数据输入时很方便。
2.? 注意分数的相加减乘除(开始时我不知道)
3.? 若分母为0则输出Inf,分子为0则输出0;(可不经过其他那些没必要的思考直接得出这个结论)
4.? 两个不超过整型的数字相乘可能会超出整形的范围,所以,定义为longlong,且函数中判断这个分数正负时,不能用if(a*b<0)的形式,因为可能会超出longlong的范围。建议任何可能会溢出的地方,都提高数据的存储单位。
5.? 总结起来,写函数时需要注意的点1. 正还是负? 2. 分母或分子是否为0? 3. 是否有整数要输出? 4.后面是否有分数要输出??
6.? 化简时,即找最大公因数时,建议用如上方法,刚试了,若用逐一遍历的方法,容易超时。
柳神的代码
#include <iostream>
#include <cmath>
using namespace std;
long long a, b, c, d;
long long gcd(long long t1, long long t2) {
return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
void func(long long m, long long n) {
if (m * n == 0) {
printf("%s", n == 0 ? "Inf" : "0");
return ;
}
bool flag = ((m < 0 && n > 0) || (m > 0 && n < 0));
m = abs(m); n = abs(n);
long long x = m / n;
printf("%s", flag ? "(-" : "");
if (x != 0) printf("%lld", x);
if (m % n == 0) {
if(flag) printf(")");
return ;
}
if (x != 0) printf(" ");
m = m - x * n;
long long t = gcd(m, n);
m = m / t; n = n / t;
printf("%lld/%lld%s", m, n, flag ? ")" : "");
}
int main() {
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
func(a, b); printf(" + "); func(c, d); printf(" = "); func(a * d + b * c, b * d); printf("\n");
func(a, b); printf(" - "); func(c, d); printf(" = "); func(a * d - b * c, b * d); printf("\n");
func(a, b); printf(" * "); func(c, d); printf(" = "); func(a * c, b * d); printf("\n");
func(a, b); printf(" / "); func(c, d); printf(" = "); func(a * d, b * c);
return 0;
}
|