2015-06-18 18 views
-1

我有一個任務來編寫一個程序,它需要一些數字和step作爲輸入。
然後,它必須使這些數字的二進制表示的序列,並在位置11*step2*step3*step摧毀位...
下面是代碼:「myList.Count」小於列表中元素的數量

using System; 
using System.Collections.Generic; 

class BitKiller 
{ 
    static void Main() 
    { 
     int 
      amountNumbers = int.Parse(Console.ReadLine()), 
      step = int.Parse(Console.ReadLine()), 
      counter = 0, 
      number = 0 
     ; 
     int[] 
      numBin= new int[8], 
      numbers = new int[amountNumbers] 
     ; 
     var sequence = new List<int>(); 
     for(int i = 0; i < amountNumbers; i++) 
     { 
      numbers[i] = int.Parse(Console.ReadLine()); 
      numBin = ToBin(numbers[i]); 
      sequence.InsertRange(counter * 8, numBin); 
      foreach(int b in sequence) 
      { 
       Console.Write(b); 
      } 
      Console.WriteLine(""); 
      counter++; 
     } 
     if(step == 1) 
     { 
      Console.WriteLine(0); 
      return; 
     } 
     for(int i = sequence.Count; i >= 0; i--) 
     { 
      if(i % step == 1) 
      { 
       sequence.RemoveAt(i); 
      } 
     } 
     Console.WriteLine("List count = {0}", sequence.Count); 
     if(sequence.Count % 8 != 0) 
     { 
      int padding = 8 - (sequence.Count % 8); 
      for(int i = 0; i < padding; i++) 
      { 
       sequence.Add(0); 
      } 
     } 
     foreach(int b in sequence) 
     { 
      Console.Write(b); 
     } 
     Console.WriteLine(""); 
     for(int i = 7, power = 0, y = 0; y < sequence.Count; i--, y++, power++) 
     { 
      number = number + (sequence[i]) * ToPower(2, power); 
      if(i == 0) 
      { 
       Console.WriteLine("Result = {0}", number); 
       sequence.RemoveRange(0, 8); 
       foreach(int b in sequence) 
       { 
        Console.Write(b); 
       } 
       Console.WriteLine(""); 
       number = 0; 
       i = 7; 
       y = 0; 
       power = 0; 
      } 
     } 
    } 

    static int[] ToBin(int number) 
    { 
     var binSequence = new int[8]; 
     for(int i = 7; i >= 0; number /= 2, i--) 
     { 
      if(number % 2 == 0 || (number == 0 && i >= 0)) 
      { 
       binSequence[i] = 0; 
      } 
      else 
      { 
       binSequence[i] = 1; 
      } 
     } 
     return binSequence; 
    } 

    static int ToPower(int number, int power) 
    { 
     int numberReturn = number; 
     if(power == 0) 
     { 
      return 1; 
     } 
     if(number == 1) 
     { 
      return number; 
     } 
     for(int i = 0; i < power - 1; i++) 
     { 
      numberReturn = numberReturn * number; 
     } 
     return numberReturn; 
    } 
} 

現在,有幾個額外的打印所以你可以看到輸入數字時出現的二進制數字。
簡而言之,我的程序將數字轉換爲僅包含'1'和'0'的列表,然後根據我的公式從此列表中刪除值。
我的主要問題是爲什麼是:

sequence.Count 

返回22,當有明顯的24「1名的名單內。
使用以下輸入進行測試:3,19,255,255,255
結果將是:255, 254, 252,而正確的輸出將是255, 255, 252

它正在發生,因爲這個代碼:

if(sequence.Count % 8 != 0) 
{ 
    int padding = 8 - (sequence.Count % 8); 
    for(int i = 0; i < padding; i++) 
    { 
     sequence.Add(0); 
    } 
} 

因爲sequence.Count是22(爲什麼?)條件爲真,以下for循環,正在取代過去兩年的「1個與2個0。
這是導致錯誤的輸出。
所以回到這一點。
當列表中有24'1時,爲什麼sequence.Count等於22。

對不起,如果它有點長和困惑,但我發佈了整個代碼,因爲我不知道是什麼以及如何幹擾導致此問題。

+1

很明顯,你的'myList.Count'返回_exactly_列表中元素的數量。你的問題是,你不希望列表中的元素數量。 –

+1

'「myList.Count」小於列表中的元素數量您是否通過調試器檢查了列表以查看是否有24個項目而不是22個? –

+0

嘗試插入:'Console.WriteLine(「循環前的列表計數= {0}」,sequence.Count);'在此行之前:'for(int i = sequence.Count; i> = 0; i-- )',你會看到'for'循環從'sequence'中移除了2個元素。原因在下面的@Ed T的答案中解釋。 – ekad

回答

3

你在這個代碼從列表中刪除兩個項目:

for(int i = sequence.Count; i >= 0; i--) 
{ 
    if(i % step == 1) 
    { 
     sequence.RemoveAt(i); 
    } 
} 

有了你給的例子輸入,sequence.RemoveAt被稱爲當我== 20,當我== 1,有24個項目,那麼你刪除了其中的2個。

0

正式注意:編程一整天會影響我的基本微積分。列表數量和條件是否都正常運行。經過一個小時的測試後,我意識到問題在於我需要將'y'和'i'都設爲-1值,因爲它們在for循環中瞬間遞增1。感謝您的提示。

+0

很高興你明白了。如果有幫助,請接受我的回答。 –

相關問題