C# 200位十进制数列表中最长的二进制数

C# 200位十进制数列表中最长的二进制数,c#,C#,我有几个字符串将数字表示为十进制。这些数字有100万) 主要的问题是,在二进制视图中,数字有200位。对这个问题不是100%确定,但正如Rup所建议的,你是在问2^200吗 这将为您提供61位十进制数字的长度。您可以将字符串解析为,并使用公式floor(log_b(x))+1计算数字中的位数(以在baseb中查找x)。大致如下: var bigInts = myStrings.Select(x => BigInteger.Parse(x)); BigInteger biggestInt

我有几个字符串将数字表示为十进制。这些数字有100万)


主要的问题是,在二进制视图中,数字有200位。

对这个问题不是100%确定,但正如Rup所建议的,你是在问2^200吗


这将为您提供61位十进制数字的长度。

您可以将字符串解析为,并使用公式
floor(log_b(x))+1
计算数字中的位数(以在base
b
中查找
x
)。大致如下:

var bigInts = myStrings.Select(x => BigInteger.Parse(x));
BigInteger biggestInt = bigInts.Max();
int bitsInBiggest = (int)Math.Floor(BigInteger.Log(biggestInt, 2)) + 1;

您可以将数字作为字符串进行比较,因为您只需要知道一个数字是否大于另一个数字。使用二进制数的十进制表示法,逐步将该数字加倍,并过滤掉小于该数字的数字,直到没有剩余的数字为止。然后你就知道最大数需要多少位了

例如:

string[] numbers = { "10", "20", "32", "64" };

string binary = "1";
int bits = 1;

do {

  numbers = numbers
    .Where(n => n.Length > binary.Length || n.CompareTo(binary) > 0)
    .ToArray();

  string s = "";
  int carry = 0;
  for (int i = binary.Length - 1; i >= 0 || carry > 0; i--) {
    if (i >= 0) {
      carry += (binary[i] - '0') * 2;
    }
    s = (char)((carry % 10) + 48) + s;
    carry /= 10;
  }
  binary = s;
  bits++;

} while (numbers.Length > 0);

Console.WriteLine(bits - 1);
输出:

7

二进制中的长度是对数到基数2,或者对数到任意基数除以对数到相同基数。您使用什么机制来存储大整数-某个BigInteger类?它有日志功能吗?看起来像。您需要查找最长的数字,还是最长数字的长度?(您在第一段中说了一件事,但在回答中给出了不同的结果。)@Rup甚至可以将字符串解析为
double
(它很容易支持足够大的值)并计算其日志-不需要“大”类。(因为你不需要在内存中精确地表示数字。)有负数吗?最长的数字也会是最高的,所以我假设你实际上不想要这个,因为它很小。实际长度由Rup给出:)