c++ - 此代码的浮点错误有人可以帮助我吗
问题描述
我遇到了这个中文余数定理的问题,我将 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;
}
解决方案
这些行:
for(int i = 1; i <= k; i++)
for(int j = 1; j <= k; j++)
将导致i
和j
超出界限。
数组索引从C 0
++ 开始,因此您应该使用.0
k-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 个值。其中一些可能是未初始化的,同样是未定义的行为。
推荐阅读
- windows - 在 Windows 10 的开始菜单中看不到 Anaconda 导航器
- apache-flink - 在 Flink 中的每个工作人员上设置 taskmanager.numberOfTaskSlots
- python - 在 python 中实现方差膨胀因子代码
- r - 如何在 R 中生成具有 90% 置信区间的回归函数的斜率?
- python - 无法将 json 列表转换为 DataFrame
- ios - ios中的缩略图关联?
- sql - 无法在 SQL 语句中使用参数
- c# - 使用 MongoDB c# 时出现错误 UpdateOne、ReplaceOne 和 DeleteMany
- php - WooCommerce 产品变体下拉列表的自定义 HTML
- linux - Bash 命令拒绝在后台运行 &