C# 如何阻止0出现在数组中

C# 如何阻止0出现在数组中,c#,.net,C#,.net,所以我有一个方法,它返回一个数的因子数组 Tools.cs public static long[] GetFactors(long number) { long range = number / 2; long potentialFactors = 2; long[] factors = new long[range + 1]; factors[0] = 1; factors[range] = number; for (long i = 1; i

所以我有一个方法,它返回一个数的因子数组

Tools.cs

public static long[] GetFactors(long number)
{
    long range = number / 2;
    long potentialFactors = 2;
    long[] factors = new long[range + 1];
    factors[0] = 1;
    factors[range] = number;
    for (long i = 1; i < range; i++)
    {
        if (number % potentialFactors == 0)
        {
            factors[i] = potentialFactors;
            potentialFactors++;
        } else
        {
            potentialFactors++;
        }    
    }
    Console.WriteLine($"here are the factors for the number {number}:\n"+string.Join("\n", factors));
    return factors;
}
static void Main(string[] args)
{
    Tools.GetFactors(24);        
    Console.ReadLine();
}
但当我运行代码时,会出现以下情况:

here are the factors for the number 24:
1
2
3
4
0
6
0
8
0
0
0
12
24

如何阻止0出现,我应该重写“for”循环,还是有办法从数组中删除0?

您正在分配一个固定大小的数组,并且仅当元素是因子时才将其设置为非零


您应该改为使用
var factors=new List()和调用
因子。添加(潜在因子)
仅存储有效因子的数字。

您正在分配一个固定大小的数组,并且仅当元素是因子时才将其设置为非零


您应该改为使用
var factors=new List()和调用
因子。添加(潜在因子)
仅存储有效因子的数字。

此代码使用的是
列表
而不是
数组
,还有一些其他更改

public static List<long> GetFactors(long number)
{
    long range = number / 2;
    List<long> factors = new List<long>() { 1 };
    for (long i = 2; i <= range; i++)
    {
        if (number % i == 0)
        {
            factors.Add(i);
        }
    }
    factors.Add(number);
    Console.WriteLine($"here are the factors for the number {number}:\n" + string.Join("\n", factors));
    return factors;
}
公共静态列表GetFactors(长数字)
{
远程=数字/2;
列表因子=新列表(){1};

对于(长i=2;i此代码使用
List
而不是
Array
,并且还有一些其他更改

public static List<long> GetFactors(long number)
{
    long range = number / 2;
    List<long> factors = new List<long>() { 1 };
    for (long i = 2; i <= range; i++)
    {
        if (number % i == 0)
        {
            factors.Add(i);
        }
    }
    factors.Add(number);
    Console.WriteLine($"here are the factors for the number {number}:\n" + string.Join("\n", factors));
    return factors;
}
公共静态列表GetFactors(长数字)
{
远程=数字/2;
列表因子=新列表(){1};

对于(长i=2;i我同意当你事先不知道你将得到多少因子时,列表会更好。但是如果你真的想使用数组。你可以在这个数组中循环,逐个找到0,然后它们留下数字。就像这样:

// Extension Method of array
      public static void RemoveAllZeros(this long[] array) // O(N^2)
            { 
                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i] == 0)
                    {
                        // Grab the index override value and continue swift left
                        for (int j = i; j < array.Length - 1; j++)
                        {
                            array[j] = array[j + 1];
                        } 
                    }
                }
            }


OR using a bit of LINQ and List :p : 
       // Extension Method of array
    public static void RemoveAllZeros(this long[] numbers)
        {
            int zeroPst = numbers.ToList().IndexOf(0); 
    
            if (zeroPst == -1)
                return;
    
            for (int i = zeroPst; i < numbers.Length - 1; i++)
            {
                numbers[i] = numbers[i + 1];
            }
    
            numbers.RemoveAllZeros(); //Recursion, carefull
        }
//数组的扩展方法
公共静态void RemoveAllZeros(此长[]数组)//O(N^2)
{ 
for(int i=0;i
我同意,如果你事先不知道你会得到多少因子,那么列表会更好。但是如果你真的想使用数组,你可以循环遍历这个数组,逐个找到0,然后将它们留下数字。就像这样:

// Extension Method of array
      public static void RemoveAllZeros(this long[] array) // O(N^2)
            { 
                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i] == 0)
                    {
                        // Grab the index override value and continue swift left
                        for (int j = i; j < array.Length - 1; j++)
                        {
                            array[j] = array[j + 1];
                        } 
                    }
                }
            }


OR using a bit of LINQ and List :p : 
       // Extension Method of array
    public static void RemoveAllZeros(this long[] numbers)
        {
            int zeroPst = numbers.ToList().IndexOf(0); 
    
            if (zeroPst == -1)
                return;
    
            for (int i = zeroPst; i < numbers.Length - 1; i++)
            {
                numbers[i] = numbers[i + 1];
            }
    
            numbers.RemoveAllZeros(); //Recursion, carefull
        }
//数组的扩展方法
公共静态void RemoveAllZeros(此长[]数组)//O(N^2)
{ 
for(int i=0;i
在每次循环迭代中递增
i
,但并不总是为
因子[i]赋值
。在不分配任何内容的循环中,它将保留其默认值0。尝试使用
列表
而不是数组,只要
。在找到新因子时向其添加
。在每次循环迭代中递增
i
,但并不总是为
因子[i]分配值
。在不分配任何内容的循环中,它将保留默认值0。尝试使用
列表
而不是数组,只要使用
。只要找到新的因子,就向其中添加
。这是正确的。尽管有强烈的家庭作业氛围,但两者都应该是好的。编辑任何人以符合预期。使用列表而不是数组数组需要非常长的时间,我以前使用过列表,但它花了30分钟,甚至没有输出任何东西,所以使用数组会很好,我认为解决方案是在数组中设置元素,但它不是一个因子,但我不知道在else语句中写什么它不是!您的程序在e它很可能进入无限循环或其他什么。试着在调试器下运行它,看看发生了什么。我决定让代码在调试器打开的情况下运行,打印数组大约需要45分钟,虽然它在20分钟时找到了最大因子,但它必须循环,直到达到范围值,我想我必须选择将for循环或其他东西最小化是正确的。尽管有强烈的家庭作业氛围,但两者都应该是好的。编辑任何人以符合预期。使用列表而不是数组需要非常长的时间,我以前使用列表,但它花了30分钟,甚至没有输出任何内容,因此使用数组将是好的,我认为解决方案是当数组中的元素不是一个因子,但我不知道在else语句中写什么它不是!您的程序似乎也有一些其他错误,它很可能进入无限循环或其他什么。请尝试运行