我有一個任務來編寫一個程序,它需要一些數字和step
作爲輸入。
然後,它必須使這些數字的二進制表示的序列,並在位置1
,1*step
,2*step
,3*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。
對不起,如果它有點長和困惑,但我發佈了整個代碼,因爲我不知道是什麼以及如何幹擾導致此問題。
很明顯,你的'myList.Count'返回_exactly_列表中元素的數量。你的問題是,你不希望列表中的元素數量。 –
'「myList.Count」小於列表中的元素數量您是否通過調試器檢查了列表以查看是否有24個項目而不是22個? –
嘗試插入:'Console.WriteLine(「循環前的列表計數= {0}」,sequence.Count);'在此行之前:'for(int i = sequence.Count; i> = 0; i-- )',你會看到'for'循環從'sequence'中移除了2個元素。原因在下面的@Ed T的答案中解釋。 – ekad