仅在NumericUpDown控件中显示素数

时间:2017-11-13 21:31:09

标签: c# winforms numbers primes

    private void numericUpDown1_ValueChanged_1(object sender, EventArgs e)
    {
        //my numeric up down var name is numrsa1//
    }

    static bool IsPrimeNumber(int value)
    {
        bool result = true;

        for (int i = 2; i < value; i++)
        {
            if (value % i == 0)
            {
                result = false;
                break;
            }
        }

        if (value <= 1)
            result = false;

        return result;
    }`

我想知道是否有一种方法可以在数字上下显示素数。我试图为大学做一个密码学工作,我需要为用户提供素数选项。

2 个答案:

答案 0 :(得分:0)

在这里你有它:)它只显示素数

private void numericUpDown2_ValueChanged(object sender, EventArgs e)
{
    //suposing you have this code
    int numrsa1 = (int)this.numericUpDown2.Value;

    //or add the rest 8 lines to your code
    if (IsPrimeNumber(numrsa1))
    {
        numericUpDown2.Value = numrsa1;
    }
    else
    {
        numericUpDown2.UpButton();
    }
}

//the rest is your code without changes, I am using you function declaration IsPrimeNumber()以验证号码并在那里打印结果。它将暂时上升并通过按升序增加控件的值来仅显示素数。

这是一个非常简单的解决方案,我可以快速测试以尽快发布:)

答案 1 :(得分:0)

因为您要求NumericUpDown控件具有类似的功能,但行为不同,我建议您创建一个新的控件PrimeNumberUpDown 扩展 NumericUpDown控件。

这是我一起来的快速版本。我测试了它可以使用鼠标或箭头键向上/向下工作,并在文本框中输入一个数字。如果它发生任何关键的事情,你可能想要更详尽地测试它。

将此代码粘贴到新文件中(相应地更新名称空间),编译,然后您应该会在工具箱中看到PrimeNumberUpDown控件,这样您就可以像使用任何其他Windows窗体控件一样使用它。

using System;
using System.Globalization;
using System.Windows.Forms;

namespace YourNameSpace
{
    public class PrimeNumberUpDown : NumericUpDown
    {
        private int _value;

        public PrimeNumberUpDown()
        {
            // Make sure default value is prime
            if (!IsPrime((int)Value))
                SetNextPrimeValue();
            _value = (int)Value;
        }

        public override void DownButton()
        {
            SetNextPrimeValue();
        }

        public override void UpButton()
        {
            SetPreviousPrimeValue();
        }

        private void SetNextPrimeValue()
        {
            int newValue = (int)Value;
            while (newValue <= Maximum)
            {
                if (IsPrime(++newValue))
                {
                    if (newValue <= Maximum)
                    {
                        Value = newValue;
                        _value = newValue;
                    }
                    return;
                }
            }
        }

        private void SetPreviousPrimeValue()
        {
            int newValue = (int)Value;
            while (newValue >= Minimum)
            {
                if (IsPrime(--newValue))
                {
                    if (newValue >= Minimum)
                    {
                        Value = newValue;
                        _value = newValue;
                    }
                    return;
                }
            }
        }

        protected override void ValidateEditText()
        {
            if (_value == 0)
            {
                base.ValidateEditText();
                return;
            }

            int newValue;
            if (int.TryParse(Text, out newValue) && IsPrime(newValue) && newValue >= Minimum && newValue <= Maximum)
            {
                _value = newValue;
                base.ValidateEditText();
            }
            else
            {
                ChangingText = true;
                Text = _value.ToString(CultureInfo.InvariantCulture);
            }
        }

        private static bool IsPrime(int number)
        {
            if (number == 1) return false;
            if (number == 2) return true;
            if (number % 2 == 0) return false;

            int boundary = (int)Math.Floor(Math.Sqrt(number));

            for (int i = 3; i <= boundary; i += 2)
            {
                if (number % i == 0) return false;
            }

            return true;
        }
    }
}