c++提交后显示运行错误

题目描述
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则不行。