C# 我的for循环不是';I don’我不想重复多少次
我现在被难住了,我不知道为什么会这样。在这个类中,我有一个函数,它在小数点之前的所有数字上循环,以从末尾剔除额外的零,并对小数点之后的数字进行循环。第二部分(删除小数点前的多余零)工作正常,但第一部分(删除小数点后的多余零)工作不正常 我必须多次调用该函数才能剔除数字右端的所有额外零,我不知道为什么。我怀疑这可能与检查字节是否==0有关,但我还不确定 仅供参考:函数在构造函数的最后调用C# 我的for循环不是';I don’我不想重复多少次,c#,for-loop,C#,For Loop,我现在被难住了,我不知道为什么会这样。在这个类中,我有一个函数,它在小数点之前的所有数字上循环,以从末尾剔除额外的零,并对小数点之后的数字进行循环。第二部分(删除小数点前的多余零)工作正常,但第一部分(删除小数点后的多余零)工作不正常 我必须多次调用该函数才能剔除数字右端的所有额外零,我不知道为什么。我怀疑这可能与检查字节是否==0有关,但我还不确定 仅供参考:函数在构造函数的最后调用 public class GiantNumber { //constructor and some o
public class GiantNumber
{
//constructor and some other functions...
public bool IsNegative { get; }
public bool HasDecimal { get; }
public List<byte> NumbersBeforeDecimal;
public List<byte> NumbersAfterDecimal;
public void CullZeroes()
{
for (int i = 0; i < NumbersBeforeDecimal.Count; i++)
{
byte number = NumbersBeforeDecimal[i];
if (number == 0)
{
NumbersBeforeDecimal.RemoveAt(i);
}
else
{
break;
}
}
for (int i = NumbersAfterDecimal.Count - 1; i >= 0; i--)
{
byte number = NumbersAfterDecimal[i];
if (number == 0)
{
NumbersAfterDecimal.RemoveAt(i);
}
else
{
break;
}
}
}
}
公共级GiantNumber
{
//构造函数和其他一些函数。。。
公共bool为负{get;}
公共bool HasDecimal{get;}
十进制之前的公共列表编号;
公共列表编号以十进制为单位;
公共无效消隐零()
{
for(int i=0;i=0;i--)
{
字节数=十进制数之后的数字[i];
如果(数字==0)
{
小数点后的数字。删除(i);
}
其他的
{
打破
}
}
}
}
我在奥萨·珀杰·尔登拉普的帮助下解决了这个问题;因为我正在删除索引并迭代下一个索引,所以每次循环时都会跳过一个索引。如果我将迭代器留空:
for (int i = 0; i < NumbersBeforeDecimal.Count; )
{
//stuff
}
for(int i=0;i
它不会跳过行!与需要更简单的代码时向后迭代相比,这可能是一个更好的主意(在我的例子中,它要好得多)。我在Ňssa pøngjǣrdenlarp;因为我正在删除索引并迭代下一个索引,所以每次循环时都会跳过一个索引。如果我将迭代器留空:
for (int i = 0; i < NumbersBeforeDecimal.Count; )
{
//stuff
}
for(int i=0;i
它不会跳过行!当您想要更简单的代码时,与向后迭代相比,这可能是一个更好的主意(在我的例子中,它要好得多)。您根本不应该这样做。RemoveAt是O(n),这意味着删除10万个数字大约需要半个小时。这比实际需要多了大约半个小时,因为它可以在几秒钟内完成。您可以在一个步骤中删除整个范围:
int j = 0;
while (j < NumbersBeforeDecimal.Count
&& NumbersBeforeDecimal[j] == 0)
{
++j;
}
NumbersBeforeDecimal.RemoveRange(0, j);
intj=0;
而(j
你根本不应该这样做。RemoveAt是O(n),这意味着删除10万个数字大约需要半个小时。这比实际需要多了大约半个小时,因为它可以在几秒钟内完成。您可以在一个步骤中删除整个范围:
int j = 0;
while (j < NumbersBeforeDecimal.Count
&& NumbersBeforeDecimal[j] == 0)
{
++j;
}
NumbersBeforeDecimal.RemoveRange(0, j);
intj=0;
而(j
问题是NumbersBeforeDecimal.RemoveAt(i)
删除当前元素,而i
仍然递增。所以下一次迭代不会检查下一个元素,而是检查它后面的元素。向后循环!(被骗)哦,好吧,这是有道理的!我只想在开始的时候去掉零(在出现有效数字之前),所以你对此有什么建议吗?编辑:如果我只是将迭代器保留在for循环中为空呢?编辑#2:如果我将其留空,它会工作!哑方法类似于while(NumbersBeforeDecimal.Count>1&&NumbersBeforeDecimal[0]==0)NumbersBeforeDecimal.RemoveAt(0)代码>。更好的方法是找到第一个非零的索引,然后删除从0到该索引的整个范围。最好的方法是根本不要用那种方式存储大数字。我之所以要用这种方式存储大数字,是因为我想有一个与BigInteger等价但带有十进制值的;事实上,我用两个大整数来做运算。我并不太在意这里的性能,因为这只是一个业余项目,我想计算Euler数,使其尽可能精确。问题是NumbersBeforeDecimal。RemoveAt(I)
删除当前元素,而I
仍然递增。所以下一次迭代不会检查下一个元素,而是检查它后面的元素。向后循环!(被骗)哦,好吧,这是有道理的!我只想在开始的时候去掉零(在出现有效数字之前),所以你对此有什么建议吗?编辑:如果我只是将迭代器保留在for循环中为空呢?编辑#2:如果我将其留空,它会工作!哑方法类似于while(NumbersBeforeDecimal.Count>1&&NumbersBeforeDecimal[0]==0)NumbersBeforeDecimal.RemoveAt(0)代码>。更好的方法是找到第一个非零的索引,然后删除从0到该索引的整个范围。最好的方法是根本不要用那种方式存储大数字。我之所以要用这种方式存储大数字,是因为我想有一个与BigInteger等价但带有十进制值的;事实上,我用两个大整数来做运算。在这里,我并不太关心性能,因为这只是一个业余项目,我想计算欧拉数,使其尽可能精确。这等于,而(0
是的,是的。这会更简单。我认为这篇文章的准确标题是“我的for循环执行的次数没有我想要的那么多。”计算机会按照你告诉他们的去做。正是你告诉他们的。同样如此。你说什么