我有一个任务是编写一个程序,它接受一些数字并输入step
。
然后它必须对这些数字进行二进制表示,并在位置1
处销毁位,1*step
,2*step
,3*step
...
这是代码:
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;
}
}
现在,还有一些额外的打印行,因此您可以在输入数字时看到二进制数字。
简而言之,我的程序会将数字转换为仅包含&#39; 1&#39;和&#39; 0&#39;然后根据我的公式从这个列表中删除值。
我的主要问题是为什么:
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循环用2个零替换我的最后两个&#39; 1。输出错误。
所以回到原点。
当列表中有24个1时,为什么sequence.Count
等于22。
很抱歉,如果它有点长且令人困惑,但我发布了整个代码,因为我不知道什么以及如何干扰导致此问题。
答案 0 :(得分:3)
您要从此代码中的列表中删除两个项目:
for(int i = sequence.Count; i >= 0; i--)
{
if(i % step == 1)
{
sequence.RemoveAt(i);
}
}
根据您提供的示例输入,当i == 20且i == 1时,正在调用sequence.RemoveAt
。有24个项目,然后您删除了其中的2个。
答案 1 :(得分:0)
正好注意:编程的一整天会影响我的基本微积分。列表计数以及条件是否都正常运行。经过一个小时的测试后,我意识到问题在于我需要将'y'和'i'都设置为-1值,因为当它们达到for循环时它们会立即递增1。感谢您的提示。