У меня есть задача написать программу, которая принимает некоторые цифры и 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 (почему?) Условие истинно, и следующий цикл заменяет двух моих последних «1 'с 2-мя нулями.
Который вызывает неправильный вывод.
Итак, вернемся к делу.
Зачем стоит sequence.Count
, если в списке осталось 24 '1.
Извините, если он немного длинный и запутанный, но я разместил весь код, потому что я понятия не имею, что и как может помешать вызвать эту проблему.
Для вас должно быть очевидно, что 'myList.Count' возвращает _exactly_ количество элементов в списке. Ваша проблема в том, что вы не ожидаете, что количество элементов будет в списке. –
'' myList.Count "меньше количества элементов внутри списка'. Вы проверили список через отладчик, чтобы увидеть, что есть 24 элемента вместо 22? –
Попробуйте вставить это: 'Console.WriteLine (« Счет списка перед циклом = {0} », sequence.Count);' перед этой строкой: 'for (int i = sequence.Count; i> = 0; i--) ', вы увидите, что цикл' for' удаляет 2 элемента из 'sequence'. Причина объясняется в ответе @Ed T ниже. – ekad