#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;
}
答案 0 :(得分:1)
这些行:
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个值起作用。其中一些可能未初始化,并且行为又未定义。