题目描述
Ray 在数学课上听说,任何小数都能表示成分数的形式,他开始化了起来,但小数很多,手工化起来很费劲,请你写一个程序把一个纯小数(0<纯小数<1)化成最简分数。
输入
第一行是一个整数N,表示有多少组数据 每组数据只有一个小数,小数的位数不超过9位,不考虑循环小数。
输出
对每一个对应的小数化成最简分数后输出,占一行。
下面贴代码
#include<iostream>
#include<cmath>
using namespace std;
int gcd(int a, int b);
int xiaoshudian(double num) {
for (int i = 0; i < 10; i++) {
num *= 10;
if (num - (int)num == 0) {
return i + 1;
}
}
}
int main()
{
int t,a=1,b;
double n;
cin >> t;
while (t--) {
cin >> n;
for (int i = 1; i <= xiaoshudian(n); i++) {
a *= 10;
}
b = n * a;
cout << b / gcd(a, b) << '/' << a / gcd(a, b)<<endl;
}
return 0;
}
int gcd(int a, int b) {
int c;
c = a % b;
while (c) {
a = b;
b = c;
c = a % b;
}
return b;
}
每次计算都需要把a重置为1,在第20行的cin >> n;后面加一句:a = 1;
修改成下面的代码试试:
#include<iostream>
#include<cmath>
using namespace std;
long long gcd(long long a, long long b);
int xiaoshudian(double num) {
for (int i = 0; i < 10; i++) {
num *= 10;
if (num - (int)num == 0) {
return i + 1;
}
}
}
int main()
{
int t;
long long a=1,b;
double *n;
cin >> t;
n = new double[t];
for (int i = 0;i<t;i++)
cin >> n[i];
for (int k = 0;k<t;k++) {
a = 1;
for (int i = 1; i <= xiaoshudian(n[k]); i++) {
a *= 10;
}
b = n[k] * a;
if (k < t-1)
cout << b / gcd(a, b) << '/' << a / gcd(a, b) << endl;
else
cout << b / gcd(a, b) << '/' << a / gcd(a, b);
}
delete[] n;
n=0;
return 0;
}
long long gcd(long long a, long long b) {
long long c;
c = a % b;
while (c) {
a = b;
b = c;
c = a % b;
}
return b;
}
估计是最后一行不应该是空行,当t为0时,最后的输出不要加endl试试
#include<iostream>
#include<cmath>
using namespace std;
int gcd(long long a, long long b);
int xiaoshudian(double num) {
for (int i = 0; i < 10; i++) {
num *= 10;
if (num - (int)num == 0) {
return i + 1;
}
}
}
int main()
{
int t;
long long a=1,b;
double n;
cin >> t;
while (t--) {
cin >> n;
a = 1;
for (int i = 1; i <= xiaoshudian(n); i++) {
a *= 10;
}
b = n * a;
if (t != 0)
cout << b / gcd(a, b) << '/' << a / gcd(a, b) << endl;
else
cout << b / gcd(a, b) << '/' << a / gcd(a, b);
}
return 0;
}
int gcd(long long a, long long b) {
int c;
c = a % b;
while (c) {
a = b;
b = c;
c = a % b;
}
return b;
}
这是修改后的代码
总结:double类型在输入后会发生一点点改变,例如此题中用0.61161来输入的话,在判断小数点位数时就是0.61160999999,导致位数过大出错,最后由于超限显示运行错误。输入0.2时为0.20000000001,之后循环10次不到1,所以可以,但是0.61161则不行。