【发布时间】:2016-01-27 03:42:03
【问题描述】:
我试图找到最小的零一数(一个仅由零和一组成的数字,即 11001),它是通过 STDIN 输入的数字的倍数,但是当我输入 99999 时程序崩溃,这是应该作为输入值工作的测试用例之一应该在 1 到 100000 之间,程序在 ulong.Parse(binary); 在 Getmultiple(ulong n) 中。
我应该做些什么改变才能让它工作?
class Program
{
static void Main(string[] args)
{
while (true)
{
string s = Console.ReadLine();
ulong l;
ulong.TryParse(s, out l);
Console.WriteLine(Getmultiple(l));
}
}
private static ulong Getmultiple(ulong n)
{
for (ulong i = 1; ; i++)
{
String binary = Convert.ToString((long) i, 2);
ulong no = ulong.Parse(binary);
if (no % n == 0)
{
return no;
}
}
}
}
错误消息:
“System.OverflowException”类型的未处理异常发生在 mscorlib.dll
附加信息:值太大或太大 对于 UInt64 来说很小。
【问题讨论】:
-
可能会更容易走过去而不是这样做。
let isValid = !s.Any(c => c != '1' && c != '0'). -
来自 STDIN 的输入,在这种情况下存储在 's' 中不是我需要验证的零一数(它的值可以从 1 到 100000),它的输出应该是零一数,我正在使用 Convert.ToString((long) i, 2);获取二进制数(以 2 为底)
-
我猜在 2^64 下没有 99,999 的“零一”倍数,那就是 ulong 的最大值...
-
你可能是正确的@pseudoDust,也许它高于 2^64,有什么方法可以输出这样的数字,我需要输出所有有效的零一数字,输入范围为 1到 100000?
-
@A.Bhuttoo 使用BigInteger。另外,请附上您收到的错误消息的文本。