比较字符串文字中包含的两个非常大的数字的最佳方法是什么?
例如,我想比较以下内容: “90000000000000000000000000000000000000000000000000000000000000000000000000001” “100000000000000000000000000000000000000000000000000000000000000000000000000009”
或
“0000000000111111111111111111111111111111111111111111111111111111111111111111” “0000001111111111111111111111111111111111111111111111111111111111111111111111”
在这两种情况下,显然第二个更大,但是如果不对元素进行迭代,我怎样才能有效地找到它呢?
答案 0 :(得分:8)
我个人会采用最简单的方法:使用BigInteger
来解析这两个值,并比较这些结果。那个不会非常有效,但它会非常简单 - 然后你可以通过基准测试看看它是否足够快 。
否则,你可以通过忽略前导零来找到有效长度 - 如果一个数字比另一个长,那么这就是你需要知道的全部内容。或者编写一个方法来获取字符串的“有效”数字,该数字可能更短,必要时返回0,然后从较长字符串的长度向下比较,直到一个字符串给出更大的值。类似的东西:
// Return the digit as a char to avoid bothering to convert digits to their
// numeric values.
private char GetEffectiveDigit(string text, int digitNumber)
{
int index = text.Length - digitNumber;
return index < 0 ? '0' : text[index];
}
private int CompareNumbers(string x, string y)
{
for (int i = int.Max(x.Length, y.Length); i >= 0; i--)
{
char xc = GetEffectiveDigit(x, i);
char yc = GetEffectiveDigit(y, i);
int comparison = xc.CompareTo(yc);
if (comparison != 0)
{
return comparison;
}
}
return 0;
}
请注意,这并不会检查它是否是有效数字,并且它绝对不会尝试处理负数。
答案 1 :(得分:2)
如果相比你的意思是布尔检查,这将起作用:
public class Program
{
static void Main(string[] args)
{
string a = "0000000090000000000000000000000000000000000000000000000000000000000000000000000000001";
string b = "000100000000000000000000000000000000000000000000000000000000000000000000000000009";
Console.WriteLine(FirstIsBigger(a, b));
Console.ReadLine();
}
static bool FirstIsBigger(string first, string second)
{
first = first.TrimStart('0');
second = second.TrimStart('0');
if (first.Length > second.Length)
{
return true;
}
else if (second.Length == first.Length)
{
for (int i = 0; i < first.Length; i++)
{
double x = char.GetNumericValue(first[i]);
double y = char.GetNumericValue(second[i]);
if (x > y) return true;
else if (x == y) continue;
else return false;
}
}
return false;
}
}
答案 2 :(得分:2)
这是另一种解决方案:
public static int CompareNumbers(string x, string y)
{
if (x.Length > y.Length) y = y.PadLeft(x.Length, '0');
else if (y.Length > x.Length) x = x.PadLeft(y.Length, '0');
for (int i = 0; i < x.Length; i++)
{
if (x[i] < y[i]) return -1;
if (x[i] > y[i]) return 1;
}
return 0;
}