题目链接:P1540 [NOIP2010 提高组] 机器翻译 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
源码:
#include <iostream>
using namespace std;
int search(int array[], int a)
{
int n = sizeof(array) / sizeof(*array);
for (int i = 0; i < n; i++) {
if (array[i] == a)
return 1;
}
return 0;
}
int main()
{
int M, N;
int i, j = 0;
int amount = 1;
cin >> M >> N;
int* array = new int[M];
int* in = new int[N];
for (i = 0; i < N; i++) {
cin >> in[i];
}
array[j] = in[0];
j++;
for (i = 1; i < N; i++) {
if (search(array, in[i])) {
continue;
}
else if (j == M) {
for (int m = 1; m < M; m++)
array[m-1] = array[m];
array[M - 1] = in[i];
amount++;
}
else{
array[j] = in[i];
amount++;
j++;
}
}
cout << amount << endl;
return 0;
}
输入样例,运行到判断第二个4是否需要再次查找时,函数search调用array出错,如图
导致无法返回期望值,经排查,发现
int n = sizeof(array) / sizeof(*array);
也无法正常得到当前 array 中的有效数据总个数。
于是,引入手动计数变量 size 来计算array中有效数据个数,再次运行示例数据,正确。
部分源码:
int search(int array[], int a, int size)
{
for (int i = 0; i < size; i++) {
if (array[i] == a)
return 1;
}
return 0;
}
int main()
{
int M, N;
int i, j = 0, size = 1;
int amount = 1;
cin >> M >> N;
int* array = new int[M];
int* in = new int[N];
for (i = 0; i < N; i++) {
cin >> in[i];
}
array[j] = in[0];
j++;
for (i = 1; i < N; i++) {
if (search(array, in[i], size)) {
continue;
}
else if (j == M) {
for (int m = 1; m < M; m++)
array[m-1] = array[m];
array[M - 1] = in[i];
amount++;
}
else{
array[j] = in[i];
amount++;
j++;
size++;
}
}
cout << amount << endl;
return 0;
}
但是关于之前的 n 为什么错,原因暂时未知。