【问题标题】:displaying the factors of a number [duplicate]显示数字的因数[重复]
【发布时间】:2018-12-12 03:43:36
【问题描述】:

我正在尝试获取用户提供的数字的所有因素,然后单击按钮在 MessageBox 上显示所有因素。

这就是 my code 代码取自 Mark ByersGetting Factors of a Number 答案的样子,我认为我非常接近,但我显示的是因子数而不是实际因子数.

例如,如果用户输入 10 并单击按钮,MessageBox 会显示数字 4,但我希望它显示 10 的实际因数,应该是 1、2、5、10。

*如何显示因子?

public int Divisors(int fact)
    {
        int number = int.Parse(textBox2.Text);
        int factorCount = 0;
        int sqrt = (int)Math.Ceiling(Math.Sqrt(number));

        for (int i = 1; i < sqrt; i++)
        {
            if (number % i == 0)
            {
                factorCount += 2; //  We found a pair of factors.
            }
        }

        // Check if our number is an exact square.
        if (sqrt * sqrt == number)
        {
            factorCount++;
        }

        return factorCount;
    }

private void ShowallButton_Click(object sender, EventArgs e)
    {
        int input = int.Parse(textBox2.Text);
        double output = Divisors(input);

        MessageBox.Show(+output + "");
    }

【问题讨论】:

  • 不更新因子计数,为什么不将因子存储在数组中,然后显示该数组(可能通过转换为字符串)。
  • 您还需要将for循环更正为for (int i = 1; i &lt;= number; i++)
  • 好吧....我还是 C# 的新手,我还没有真正弄清楚如何使用数组....
  • 你可以通过解决这个问题来开始解决这个问题......如果不是数组,你可以使用字符串来生成输出并从方法中返回。
  • 我严重怀疑它是“你的代码”:stackoverflow.com/questions/4549482/getting-factors-of-a-number。所以复制/粘贴代码时需要署名 - 署名已编辑。

标签: c# math


【解决方案1】:
        public List<int> Divisors(int fact)
    {
        List<int> factors = new List<int>();
        int number = int.Parse(textBox2.Text);
        int factorCount = 0;
        int sqrt = (int)Math.Ceiling(Math.Sqrt(number));

        for (int i = 1; i < sqrt; i++)
        {
            if (number % i == 0)
            {
                factors.Add(i);
                factorCount += 2; //  We found a pair of factors.
            }
        }

        // Check if our number is an exact square.
        if (sqrt * sqrt == number)
        {
            factorCount++;
        }

        // return factorCount;
        return factors;
    }
    private void ShowallButton_Click(object sender, EventArgs e)
    {
        int input = int.Parse(textBox2.Text);
        List<int> factors = Divisors(input);
        string message = $"The Divisors are {string.Join(",", factors)}";
        MessageBox.Show(message);
    }

【讨论】:

  • 我不会更新你的任何逻辑,但这就是我要显示结果的方式。
【解决方案2】:

这根本不是很接近。

让我们先看看因式分解

% Operator (C# Reference)

余数运算符 % 计算除其后的余数 第一个操作数的第二个操作数。

public static void Divisors(int number )
{
   for (var x = 1; x <= number; x++)
      if (number % x == 0) // no remainder it must be a factor
         Console.WriteLine(x);
}

用法

Divisors(10);

输出

1
2
5
10

现在让我们使用yield 返回一个Enumerable

public static IEnumerable<int> Divisors(int number )
{
   for (var x = 1; x <= number; x++)
      if (number % x == 0) // no remainder it must be a factor
         yield return x;
}

用法

var results = Divisors(10);

Console.WriteLine(string.Join(", ", results));

输出

1, 2, 5, 10

其他资源

yield (C# Reference)

当您在语句中使用 yield 上下文关键字时,您表示 它出现的方法、运算符或 get 访问器是 迭代器。使用 yield 来定义一个迭代器消除了对一个迭代器的需要 显式的额外类(保存状态的类 枚举,请参阅 IEnumerator 示例)当您实现 用于自定义集合类型的 IEnumerable 和 IEnumerator 模式。

String.Join Method

连接指定数组的元素或数组的成员 集合,在每个元素之间使用指定的分隔符或 会员。

【讨论】:

    【解决方案3】:
    private void ShowallButton_Click(object sender, EventArgs e)
        {
            var input = int.Parse(textBox2.Text);
            var output = Divisors(input);
    
            var message = string.Join(Environment.NewLine, output);
            MessageBox.Show(message);
        }
    
        public List<int> Divisors(int number)
        {
            var factors = new List<int>();
            for (var i = 1; i <= number; i++)
            {
                if (number % i == 0)
                {
                    factors.Add(i);
                }
            }
            return factors;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2018-10-12
      • 1970-01-01
      相关资源
      最近更新 更多