题目来源:http://116.56.140.75:8000/JudgeOnline/problem.php?id=1723
1723: 分式化简
时间限制: 1 Sec 内存限制: 64 MB题目描述
在数学的运算中我们经常需要对分数进行化简,化为最简分数,即分子分母除了正负1意外,没有其它约数。下面请你编程实现分数的化简。
输入
第一行有一个整数n(1≤n≤10000),表示测试用例的个数。其后n行,每行有一个分数,分子和分母之间有一个除号“/”分隔,并且分母不为零。如果结果为非零整数则表示为整数形式,如果结果为0,则表示为0;
输出
输出每个分数的最简形式。具体格式参见输入样例。
样例输入
10
24/18
-24/18
24/-18
-24/-18
10/2
10/-2
10/1
10/-1
0/24
0/-25
样例输出
4/3
-4/3
-4/3
4/3
5
-5
10
-10
0
0
解析:提取“/”两边的数据,进行处理
代码:
#include <iostream>
#include<cmath>
#include<algorithm>
#include<string.h>
using namespace std;
long long int gcd(long long int b, long long int a)
{
if (b == 0)
return a;
else
return gcd(a%b, b);
}
int main()
{
int t;
cin >> t;
int num;
char ch[50];
while (t--)
{
cin >> ch;
long long int n = 0, m = 0;
int num = strlen(ch);
int i = 0;
int count = 0;
for (; count < 50; count++)
if (ch[count] == '/')
break;
if (ch[0] != '-')
{
for (i = count-1; i >=0; i--)
{
n += (ch[i] - '0')*pow(10, count - 1 - i);
}
}
else
{
for (i = count-1; i >=1; i--)
{
n += (ch[i] - '0')*pow(10, count - i - 1);
}
n *= -1;
}
if (ch[count + 1] != '-')
{
for (int j = num-1; j >count; j--)
{
m += (ch[j] - '0')*pow(10, num - 1 - j);
}
}
else
{
for (int j =num-1; j >count+1; j--)
{
m += (ch[j] - '0')*pow(10, num - 1 - j);
}
m *= -1;
}
if (n == 0)
{
cout << "0" << endl;
continue;
}
long long int M = m, N = n;
if (m < 0)
m = -1 * m;
if (n < 0)
n *= -1;
num = gcd(m, n);
m /= num;
n /= num;
if (m == 1)
{
if (N*1.0 / M > 0)
cout << n << endl;
else
cout << "-" << n << endl;
}
else
{
if (N*1.0 / M > 0)
cout << n << "/" << m << endl;
else
cout << "-" << n << "/" << m << endl;
}
}
return 0;
}
/**************************************************************
Problem: 1723
User: 201730685257
Language: C++
Result: 正确
Time:0 ms
Memory:1496 kb
****************************************************************/