此代码的浮点错误有人可以帮助我吗

时间:2019-11-13 15:55:10

标签: c++ floating-point

我正面临着这个中国余数定理的问题 我将input.txt文件作为输入 并尝试生成output.txt文件,但显示浮点错误。当我当时使用某些特定输入运行时,它可以工作,但对于许多测试用例,它却无法工作

#include <bits/stdc++.h>
#include <fstream>
#include <iostream>

using namespace std;

int ModInverse(int a, int m)
{
    a = a % m;
    for(int x = 1; x < m; x++)
        if(((a * x) % m) == 1) return x;
}

int findMinX(int num[], int rem[], int k) {
    int prod = 1;

    for(int i = 1; i <= k; i++) prod *= num[i];

    int result = 0;
    for(int j = 1; j <= k; j++) {
        int y = prod / num[j];

        result = result + rem[j] * ModInverse(y, num[j]) * y;
    }

    return result % prod;
}
int main() {
    ifstream infile;
    infile.open("input.txt");

    int n;
    int num[100];
    int rem[100];

    infile >> n;
    for(int i = 0; i < n; i++) infile >> num[i];

    for(int i = 0; i < n; i++) infile >> rem[i];

    infile.close();

    int k = sizeof(num) / sizeof(num[0]);

    ofstream myfile;
    myfile.open("output.txt");
    myfile << findMinX(num, rem, k);
    myfile.close();

    return 0;
}

1 个答案:

答案 0 :(得分:1)

这些行:
for(int i = 1; i <= k; i++)
for(int j = 1; j <= k; j++)
将导致ij超出范围。

数组索引从C ++的0开始,因此您应该使用索引0k-1

执行此操作:

for(int i = 0; i < k; i++)
for(int j = 0; j < k; j++)

此功能值得检查的另一件事:

int ModInverse(int a, int m)
{
    a = a % m;
    for(int x = 1; x < m; x++)
        if(((a * x) % m) == 1) return x;
}

给出错误的输入,它将退出循环,不返回任何内容,这将导致未定义的行为。如果文件包含您无法处理的数据,请验证输入并打印错误消息。

下面是一个input.txt使其崩溃的示例:

5
1 2 3 4 5
2 3 4 5 6

另一个值得关注的原因是,在调用函数时,您使用k而不是n
myfile << findMinX(num, rem, k);

这意味着该功能将始终对100个值起作用。其中一些可能未初始化,并且行为又未定义。