除数找到函数的问题。预计是<system.int32 [2]>

时间:2018-02-18 08:33:32

标签: c# arrays methods

我遇到以下问题:

创建一个名为divisors / Divisors的函数,它接受一个整数并返回一个包含所有整数除数的数组(除1和数字本身除外)。如果数字是素数返回字符串'(整数)是素数'(在C#中为null)(在Haskell中使用字符串a和在Rust中使用结果,字符串&gt;)。

我的代码:

static int[] divisors(int a)
    {
        int[] array = new int[a];
        int x = 0;


        for( int i =2; i<a; i++)
        {

            if(a % i == 0)
            {
                array[x] = i;
                x++;
            }

        }

        if(array.Length == 0)
        {

            return null;
        }
        else
        {
            return array;
        }

    }

当我尝试运行它时,它会抛出:

 "Expected is <System.Int32[2]>, actual is <System.Int32[15]>
  Values differ at index [2]
  Extra:    < 0, 0, 0... >"

不知道如何处理这个问题。 我真的很感激一些帮助。

溶剂:

using System.Collections.Generic;
public class Kata
{
  public static int[] Divisors(int n)
  {         
            List<int> numbers = new List<int>();

            for (int i = 2; i < n; i++)
            {
                if (n % i == 0)
                {
                    numbers.Add (i);

                }
            }
            if (numbers.Count == 0)
            {
                return null;
            }
            else
            {
                int[] array = new int[numbers.Count];
                array =numbers.ToArray();
                return array;    
            }
    }
}

1 个答案:

答案 0 :(得分:0)

我的代码没有出现错误;但是,您的函数不会返回null,因为您已将数组的长度确定为a。所以长度永远不会为零。您将获得所有这些零,因为值类型为您初始化。你的int数组填充了零。我认为这个练习应该向你证明一个不同的集合类型更适合需要动态调整大小的数据但是如果你需要坚持数组,那么这里有一些代码。

static int[] divisors(int a)
        {
            int x = 0;
            int[] array = new int[x];
            for (int i = 2; i < a; i++)
            {
                if (a % i == 0)
                {
                    x++;
                    Array.Resize<int>(ref array, x);
                    array[x-1] = i;
                }
            }
            if (array.Length == 0)
                return null;
            else
                return array;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int b = Int32.Parse(textBox1.Text);
            int[] a = divisors(b);
            if (a == null)
                MessageBox.Show($"{b} is a prime number.");
            else
            { 
                foreach (int x in a)
                {
                    Debug.Print(x.ToString()); 
                }
            }
        }