Codeforces问题339A - http://codeforces.com/problemset/problem/339/A
我试图对存储在数组偶数位置的值进行排序(从0开始)。运行程序或程序时出错,返回垃圾值。我的解决方案出了什么问题?
我的解决方案:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char s[101],temp;
int i,j;
cin>>s;
for(i=0;i<strlen(s);i+=2) //Bubble sorting values at even values of i.'+' is stored at odd values of i.
{
for(j=0;j<(strlen(s)-i-2);j+=2)
{
if(s[j]>s[j+2])
{
temp=s[j];
s[j]=s[j+2];
s[j+2]=temp;
}
}
}
cout<<s;
}
答案 0 :(得分:1)
你的编译器应该警告你这个问题(你确实打开了所有警告,是吗?总是这样做!):i==strlen(s)-1
后,j
的循环对于有符号/无符号值的算术规则的魔力,它本质上是无限的。
for(unsigned j=0; j+2+i < strlen(s); j+=2)
没有这个问题。 (i
也应为unsigned
。)
或者之前停止i
的循环。您的代码中的问题仍然存在,但您不会遇到它。但我认为这是更糟糕的路线 - 修复错误,然后优化,观察i
不需要走得太远,因为最后一个字符已经形成一个排序序列
答案 1 :(得分:0)
改变这个:
for(i=0;i<strlen(s);i+=2)
进入这个:
for(i=0;i<strlen(s) - 2;i+=2)
否则,s
值的处理超出其终点
答案 2 :(得分:0)
对于len
的奇数长度s
,外部循环一直运行到i==len-1
。然后内环终止于len - len - 1 - 2
。由于strlen
返回无符号类型,因此计算结果为非常大的无符号数,导致内循环读取超出s
末尾的路径。最终,您将获得无法读取或写入的内存,从而导致崩溃。
您可以通过更快结束外部循环来解决此问题
int len = strlen(s);
for(i=0;i<len-2;i+=2) {
for(j=0;j<(len-i-2);j+=2)
答案 3 :(得分:0)
这是我的代码
void bubble(int a[], int n){
for(int i=0; i<n; i++){
int swaps=0;
for(int j=0; j<n-i-1; j++){
if(a[j]>a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
swaps++;
}
}
if(swaps==0)
break;
}
}