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;
}`
我想知道是否有一种方法可以在数字上下显示素数。我试图为大学做一个密码学工作,我需要为用户提供素数选项。
答案 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;
}
}
}