从有序数组开始
[1, 2, 3, 4, 5, 6, 8, 9, 10]如何才能让每次迭代都得到以下结果?
1 2 3 4 5 6 7 8 9 10
1 3 4 5 6 7 8 9 10 2
1 4 5 6 7 8 9 10 2 3
1 5 6 7 8 9 10 2 3 4
1 6 7 8 9 10 2 3 4 5
1 7 8 9 10 2 3 4 5 6
1 8 9 10 2 3 4 5 6 7
1 9 10 2 3 4 5 6 7 8
1 10 2 3 4 5 6 7 8 9
#include <stdio.h>
#define MAX 10
int a[MAX], i,j,cnt=2;
main (){
for (i=0; i<MAX; i++){
a[i]= i+1;
}
for (i=0; i<MAX; i++) {
printf ("%d ", a[i]);
}
printf ("\n");
for (j=0; j < MAX-2;j++){
a[0]=1;
for (i=1; i < MAX-1; i++){
if (a[i]%MAX != 0){
a[i]= a[i] + 1;
}else{
if (a[i]==10) {
//printf ("a[%d]: %d \t ** %d\n", i , a[i] ,cnt);
//a[i-1]= i;
a[i] = cnt;
}
}
}
for (i=0; i<MAX; i++) {
printf ("%d ", a[i]);
}
printf ("\n");
}
}现在我几乎得到它,但最后一列是不正确的,我应该怎么做?
1 2 3 4 5 6 7 8 9 10
1 3 4 5 6 7 8 9 10 10
1 4 5 6 7 8 9 10 2 10
1 5 6 7 8 9 10 2 3 10
1 6 7 8 9 10 2 3 4 10
1 7 8 9 10 2 3 4 5 10
1 8 9 10 2 3 4 5 6 10
1 9 10 2 3 4 5 6 7 10
1 10 2 3 4 5 6 7 8 10 发布于 2011-06-05 09:56:39
C数组从0开始编制索引。因此,当您访问从1到MAX的元素时,您正在运行数组的末尾。
让你的循环从0到MAX-1。通常的编写方式是
for (i=0 ; i < MAX ; ++i)...so任何阅读您代码的人都可以立即证明数组索引永远不会等于MAX。
发布于 2011-06-05 09:58:43
嗯,至少,C中的数组是从零开始的,所以你写的东西超过了数组的末尾。对于声明为int foo[MAX]的数组,有效元素来自foo[0]…foo[MAX-1]
具体地说,aMAX很可能引用变量i使用的内存位置,导致在试图覆盖aMAX时重置循环。
或者将所有内容向下移动一位,或者声明数组MAX+1并忽略零位。
哦,而且您不需要每次都设置a1=1;。
https://stackoverflow.com/questions/6240527
复制相似问题