A Mirror的博客

不许说话不许笑 [手动滑稽]

0%

洛谷报错RE的原因及解决方法

1.数组开太小

这是一道来自洛谷的题目(P1781

题目描述
地球历公元 6036 年,全宇宙准备竞选一个最贤能的人当总统,共有 nn 个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。
说明:1≤n≤20

这是我最初写的代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
int n;
zongtong zt[20];
cin>>n;
for(int i=1;i<=n;i++){
zt[i].num=i;
string temp;
cin>>temp;
zt[i].ticket=temp;
zt[i].weishu=zt[i].ticket.length();
}
sort(zt+1,zt+n+1,cmp);
cout <<zt[1].num<<endl<<zt[1].ticket;

可以看到,结构体数组下标是从1开始使用的,而报出RE的测试点,n=20。
修改后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
int n;
-zongtong zt[20];
+zongtong zt[21];
cin>>n;
for(int i=1;i<=n;i++){
zt[i].num=i;
string temp;
cin>>temp;
zt[i].ticket=temp;
zt[i].weishu=zt[i].ticket.length();
}
sort(zt+1,zt+n+1,cmp);
cout <<zt[1].num<<endl<<zt[1].ticket;

或者改成

1
2
3
4
5
6
7
8
9
10
11
12
13
int n;
zongtong zt[20];
cin>>n;
-for(int i=1;i<=n;i++){
+for(int i=0;i<=n;i++){
zt[i].num=i;
string temp;
cin>>temp;
zt[i].ticket=temp;
zt[i].weishu=zt[i].ticket.length();
}
sort(zt,zt+n,cmp);
cout <<zt[0].num<<endl<<zt[0].ticket;

后两种方法均可
编程一定要注意细节,有时和AC就差一个1

总结

使用数组,下标从1开始时,定义长度一定要比最大值大1;从0开始使用,可以为n。

2.数组开太大

以前写代码时,题目给出n的最大限制为10^9。我就直接写了int a[1000000000]。[手动笑哭 ]在dev中都无法运行,更别说有内存限制的测评系统了。

同样,dev-c++试一试。代码如下:

1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;
int main(){
int a[1000000000];
for(int i=0;i<10;i++){
cin>>a[i];
}
cout <<"正确结束";
return 0;
}

请注意!编译不会出现任何问题

但运行会出问题

连输入的机会都不给我么???

数组开太大而超出了内存限制,就会出现RE的错误。
这是一个示例,洛谷题目寻宝。这是我写的题解,中间提到了这个问题,点击查看

总结

在使用数组时,如果设定长度特别大(比如那个10^9),就不能使用数组,属于算法问题
还有一种情况,有时数组的长度需要估算,如果估算过大也会出现这样的情况(适可而止

3.出现了除以0

使用dev-c++进行测试

1
2
3
4
5
6
#include<iostream>
using namespace std;
int main(){
cout <<10/0;
return 0;
}

编译后,出现了警告信息:

结果:如图所示,没有结果。

这类错误,对我个人而言,常出现在筛素数中。写for循环,顺手直接int i=0,下一句n/i。哈哈,多棒

感谢您的支持!