English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

題目是INPUT一數N~MALLOC空間存1到N~再RANDOM這些數(1到N從新排列)~以3個數1列的方式OUTPUT出來
(P.S我是用洗牌的方法做的)


#include
#include
#include
void swap(int *x, int *y)
{
int tmp;
tmp = *x;
*x=*y;
*y=tmp;
}

int main(void){
int N,i,j,tmp;
void swap(int *, int *);
int *a;
scanf("%d",&N);
a = (int *)malloc(sizeof(int)*N);

for(i=1;i<=N;i++)
a[i-1]=i;
srand(time(NULL));

for(i = 1; i <= N; i++){
j = rand() % N +1;
swap(&a[i-1],&a[j]);

printf("%d\n",a[j]);
}
return 0;
}

2006-12-19 19:55:13 · 2 個解答 · 發問者 ? 1 in 電腦與網際網路 程式設計

所以把加1去掉囉 答案還是不對ㄟ

2006-12-20 08:06:16 · update #1

2 個解答

1. 一個大錯
j = rand() % N +1;
swap(&a[i-1],&a[j]);

當 j = N 時, a[j] 超出定義範圍
==> 去掉 "+1"

2. 一個小錯
printf("%d\n",a[j]);
==> 應該是 printf("%d\n",a[i]); 吧
==> 改完後產生新錯誤 (當 i = N 時, a[i] 超出定義範圍)

3. OUTPUT 的型態與題目所要求的不合
==> 全部改正如下

for(i = 1; i <= N; i++){
j = rand() % N +1;
swap(&a[i-1],&a[j]);
printf("%dn",a[j]);
}
===========================
for(i = 0; i < N; i++)
{
j = rand() % N;
swap(&a[i], &a[j]);
}

for(i = 0; i < N; i++)
{
printf("%4d",a[i]);
if ((i+1)%3 == 0) printf("\n");
}
printf("\n");

2006-12-20 09:01:10 · answer #1 · answered by JJ 7 · 0 0

j = rand() % N +1;
這行 會產生1~N的亂數值

EX 你的N為5
陣列足標會從0~4
亂數值會從1~5 放入j
swap(&a[i-1],&a[j]);
那就會機會將不存在的a[5]位址丟入swap複函式去運算
a[5]是沒有定義的

AND 你printf的地方 變數應該是i 非j
printf("%d\n",a[i]);


希望你知道我再講什麼 我表達不好 = =

2006-12-20 14:04:50 補充:
請問你的功能是?
輸入一個N
malloc N個位置的陣列
依序填入1~N進去陣列
之後用亂數將陣列內容打亂

注意這行
AND 你printf的地方 變數應該是i 非j
printf("%dn",a[i]);
你印出J 它是印出亂數位址的值

2006-12-20 03:50:49 · answer #2 · answered by Anonymous · 0 0

fedest.com, questions and answers