#include<stdio.h> int A[100],B[100]; int main() { int n, i, j, max; while (scanf("%d", &n) != EOF) { for (i= 0; i < n; i++) { scanf("%d",&A[i]); } B[0]= 1; for (i= 1; i < n; i++) { max= 0; for (j= 0; j < i; j++) { if (A[i] < A[j] || B[j] > max) { max= B[j]; } } B[i]= max+1; } max= B[0]; for (i= 1; i < n; i++) { if (max < B[i]) { max= B[i]; } } printf("%d\n",max); } return 0; }哪里有错误
时间: 2024-02-10 12:12:13 浏览: 162
这段代码实现了求解最长上升子序列的长度,但是在第一个 while 循环中,没有对 n 进行判断,如果输入的 n 大于 100,会导致数组越界。因此,建议在循环外部先判断一下 n 是否大于 100,如果大于 100,可以提示用户输入错误并重新输入。
另外,在比较 A[i] 和 A[j] 的大小时,应该使用小于等于的符号,因为当 A[i] 等于 A[j] 时,也可以作为上升子序列的一部分。
修改后的代码如下:
```c
#include <stdio.h>
int A[100], B[100];
int main() {
int n, i, j, max;
while (scanf("%d", &n) != EOF) {
if (n > 100) { // 判断 n 是否大于 100
printf("n is too large, please input again.\n");
continue;
}
for (i = 0; i < n; i++) {
scanf("%d", &A[i]);
}
B[0] = 1;
for (i = 1; i < n; i++) {
max = 0;
for (j = 0; j < i; j++) {
if (A[i] <= A[j] || B[j] > max) { // 修改比较符号
max = B[j];
}
}
B[i] = max + 1;
}
max = B[0];
for (i = 1; i < n; i++) {
if (max < B[i]) {
max = B[i];
}
}
printf("%d\n", max);
}
return 0;
}
```
阅读全文