pat1008段错误

来源:互联网 发布:淘宝产品摄影 编辑:程序博客网 时间:2024/06/10 23:33

段错误 您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起 

存在段错误代码:

#include<stdio.h>#define SIZE 110void reverse(int ary[], int from, int to){int t;while(from < to){t = ary[from];ary[from] = ary[to];ary[to] =  t;from++;to--;}return;}int main(){#ifdef ONLINE_JUDGE#elsefreopen("E:\\in.txt", "r", stdin);#endifint n, m;while(scanf("%d %d", &n, &m) != EOF){int i,ary[SIZE];for(i=0;i<n;i++){scanf("%d", &ary[i]);}reverse(ary, 0, n-m-1);reverse(ary, n-m,n-1);reverse(ary, 0, n-1);for(i=0;i<n-1;i++){printf("%d ",ary[i]);}printf("%d\n", ary[i]);}return 0;}

根据提示,可能是数组越界,正常的想法是默认了n>=m, 但是题目并没有给出,一个包含6个数的数组,就不能循环右移吗?

m>n,时,移动m次与移动m%n,的效果是相同的,所以执行m=m%n,便可使m<n。全部Case通过。

#include<stdio.h>
#define SIZE 110
void reverse(int ary[], int from, int to){
int t;


while(from < to){
t = ary[from];
ary[from] = ary[to];
ary[to] =  t;
from++;
to--;
}
return;
}




int main(){


#ifdef ONLINE_JUDGE
#else
freopen("E:\\in.txt", "r", stdin);
#endif




int n, m;
while(scanf("%d %d", &n, &m) != EOF){
m=m%n;
int i,
ary[SIZE];
for(i=0;i<n;i++){
scanf("%d", &ary[i]);
}


reverse(ary, 0, n-m-1);
reverse(ary, n-m,n-1);
reverse(ary, 0, n-1);


for(i=0;i<n-1;i++){
printf("%d ",ary[i]);
}
printf("%d\n", ary[i]);


}
return 0;
}

0 0