2015-06-20 107 views
0

壞鍛鍊聲明

enter image description here

的說法是有點曖昧。我真的不明白他們想要什麼。 我可以使用只是一個普通的for loop顯示期望的結果:

int step = 0 
for(int i = 1; i < m + 1; i++) 
{ 
    if(i != p) 
    { 
     printf("(%d, %d)", step, i); 
     step++; 
    } 
} 

這是他們真正想要的是什麼?我看到他們在談論線性時間,所以我認爲這不是那麼容易?我是否應該構建他們正在談論的矢量,然後刪除它?

+0

我的理解是,這些步驟需要遵循patterm(1,...) (2,..)(2,..)(3,..)(3,..),(3,..)(3,..)(4,..)等等。看到一個數據結構,你實際上'刪除',並尊重現有的刪除。 – greggo

+0

不,這顯然不是問題所要求的。在這個問題中重要的是從元素中刪除元素的方式;打印結果只是問題的一小部分。 –

+0

@greggo你會如何處理它,你能給我一個僞代碼或者你的解決方案的描述嗎? – cristid9

回答

1

是這樣的? (與gcc test.c -lm編譯)

#include <stdio.h> 
#include <math.h> 

int main(void) { 
    int i, j; 
    int n = 4; 
    int m = (int)pow(2,n); 
    int p = 5; 

    for(i = 1; i <= n; i++) 
    { 
     for(j = (int)pow(2,i-1); j < ((int)pow(2,i)); j++) 
     { 
      if(j == p) { 
       continue; 
      } 
      printf("%d, %d\n", i, j); 
      // remove vector[j] 
      if((j == (m-1)) && (m != p)) { 
       printf("%d, %d\n", i, m); 
       // remove vector[m] 
      } 
     } 
    } 
    return 0; 
} 

運行結果n=3, p=5

1, 1 
2, 2 
2, 3 
3, 4 
3, 6 
3, 7 
3, 8 

運行結果n=4, p=5

1, 1 
2, 2 
2, 3 
3, 4 
3, 6 
3, 7 
4, 8 
4, 9 
4, 10 
4, 11 
4, 12 
4, 13 
4, 14 
4, 15 
4, 16 
1

你應該寫完整的代碼。讓我簡單說一下:

  • 它應該刪除數組中的每個元素。
  • 在循環結束時,程序應該打印出步驟和其中一個已刪除的數字,格式爲(k, q),其中k是您所在的步驟,並且q是您刪除的元素之一。
  • 每次刪除元素時,都可以通過X進行更改。
  • 您還需要記住它們告訴您使用的算法以及「遊戲規則」,例如:n應該是正數和整數。

如果你不明白的算法,只是儘量把想法在紙上:

當我把n = 1,我應該從數組中刪除一個元素。當n = 2,2個元素時,它應該刪除4個元素,n = 4刪除8個元素等。

正如我們所看到的,它非常簡單,因爲它像一個幾何級數。