大佬帮忙看看,我的代码怎么不输出结果

P1116 车厢重组

为什么你要写两个输入...
by 明依 @ 2019-10-20 14:44:49


@[小小明](/space/show?uid=155826) 数组啊
by xzit20190507139 @ 2019-10-20 14:46:14


@[xzit20190507139](/space/show?uid=256089) 数组也不是那样读入的QWQ
by lxy__ @ 2019-10-20 14:48:15


@[b612](/space/show?uid=138280) 老师这么教的,读入n个数
by xzit20190507139 @ 2019-10-20 14:53:26


@[xzit20190507139](/space/show?uid=256089) 您的“int a[n]”后面写了个输入a[i],然后在倒数第7行又写了个输入...很明显就没有输出啊(因为程序认为你还没有把输入数据输完) 并且,由于您是从下标1开始存储的,所以数组大小应该开a[n+1]
by 明依 @ 2019-10-20 14:54:04


@[小小明](/space/show?uid=155826) ```cpp #include<stdio.h> int main(){ int n,i; scanf("%d",&n); int a[n]; for(i=1;i<n;i++){ scanf("%d",&a[i]); } int j,b,c; for(c=n;c>1;c--){ i=n; for(;i>1;i--){ b=a[i]; a[i]=a[i-1]; a[i-1]=b; if(a[i]==i){ continue; } j=j+1; } } printf("%d",j); } ``` 这样哪儿错
by xzit20190507139 @ 2019-10-20 15:11:41


@[xzit20190507139](/space/show?uid=256089) 首先,最外面那层for循环中的j=j没有必要写 由于题目要求是从小到大排序,所以在交换两个数的那三行外面应该加一个判断条件,即if(a[i]<a[i-1])那么才交换,否则这一次交换无法达到目的。 然后那个if(a[i]==i) continue窝没有看懂啊...QAQ。感觉这一句没有必要吧。
by 明依 @ 2019-10-20 15:15:27


@[xzit20190507139](/space/show?uid=256089) 修改后代码: ```cpp #include <cstdio> int main() { int n, i; scanf("%d", &n); int a[n + 1]; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); int j = 0, b, c; for (c = n; c > 1; c--) { i = n; for (; i > 1; i--) { if (a[i] < a[i - 1]) { b = a[i]; a[i] = a[i - 1]; a[i - 1] = b; j = j + 1; } } } printf("%d", j); } ```
by 明依 @ 2019-10-20 15:17:13


其中,第二层for循环可以把i>1改为i>n-c+1。因为最外层for循环每循环一次,序列的第n-c+1个数就已经确定好位置了。这样写可以快一些(如果您学过时间复杂度的话就知道了) 建议您再多康康排序的原理
by 明依 @ 2019-10-20 15:19:09


@[小小明](/space/show?uid=155826) ```cpp #include<stdio.h> int main(){ int n,i; scanf("%d",&n); int a[n]; for(i=1;i<n;i++){ scanf("%d",&a[i]); } int j,b,c; for(c=n;c>1;c--){ i=n; for(;i>1;i--){ if(a[i]<a[i-1]){ b=a[i]; a[i]=a[i-1]; a[i-1]=b; } } j=j+1; } printf("%d",j); } ``` 结果是38 好像循环多了,我感觉没问题啊
by xzit20190507139 @ 2019-10-20 15:31:40


| 下一页