除数查找功能的问题。预期为 <System.Int32[2]>

Posted

技术标签:

【中文标题】除数查找功能的问题。预期为 <System.Int32[2]>【英文标题】:Issue with divisors finding function. Expected is <System.Int32[2]> 【发布时间】:2018-07-28 17:19:48 【问题描述】:

我对以下问题有疑问:

创建一个名为 divisors/Divisors 的函数,它接受一个整数并返回一个包含所有整数除数的数组(除了 1 和数字本身)。如果数字是素数,则返回字符串 '(integer) is prime'(在 C# 中为 null)(在 Haskell 和 Result 中使用 Either String a,在 Rust 中使用 String>)。

我的代码:

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;    
            
    

【问题讨论】:

您的数组大小错误。使用List&lt;int&gt;,添加符合条件的值,return yourList.ToArray() 一个简单的解决方案是将您的数组复制到一个大小合适的新数组中,然后再返回它 另外,请考虑一下:如果您要查找除数字本身之外的6 的所有除数,您为什么要检查5?如果它是8 的除数,为什么还要检查7。有一个数过去你再也找不到除数了,你能找出是哪一个吗? 谢谢!设法使用列表修复。 @InBetween 我猜你永远不会超过你正在寻找除数的数字的一半。 【参考方案1】:

您的代码没有出现该错误;但是,您的函数不会返回 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()); 
                
            
        

【讨论】:

以上是关于除数查找功能的问题。预期为 <System.Int32[2]>的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法优化此代码以查找数字的除数?

查找数字除数的总数,用于python中的t测试用例

异常处理 除数 圆

LeetCode二分查找1283.使结果不超过阈值的最小除数&875.爱吃香蕉的珂珂

在EXCEL中啥情况下会出现#num!,#name,#,#ref!等错误信息报告

XML 反序列化 System.InvalidOperationException” <Objects xmlns=''> 不是预期的