所以,这是我要解决的问题:
我想计算2 ^(n)其中0< N'LT; 10000
我将数组的每个元素表示为一个空格,其中4位数应为"生活"如果出现额外的数字,我将它替换为该数组的下一个元素。
我使用的原则如下:
我使用的代码如下:
static string NotEfficient(int power)
{
if (power < 0)
throw new Exception("Power shouldn't be negative");
if (power == 0)
return "1";
if (power == 1)
return "2";
int[] A = new int[3750];
int current4Digit = 0;
//at first 2 is written in first element of array
A[current4Digit] = 2;
int currentPower = 1;
while (currentPower < power)
{
//multiply every 4digit by 2
for (int i = 0; i <= current4Digit; i++)
{
A[i] *= 2;
}
currentPower++;
//checking every 4digit if it
//contains 5 digit and if yes remove and
//put it in next 4digit
for (int i = 0; i <= current4Digit; i++)
{
if (A[i] / 10000 > 0)
{
int more = A[i] / 10000;
A[i] = A[i] % 10000;
A[i + 1] += more;
//if new digit should be opened
if (i + 1 > current4Digit)
{
current4Digit++;
}
}
}
}
//getting data from array to generate answer
string answer = "";
for (int i = current4Digit; i >= 0; i--)
{
answer += A[i].ToString() + ",";
}
return answer;
}
我遇到的问题是它没有正确显示数字,实际上包含0。例如2 ^(50)= 1 125 899 906 842 624并且使用我的算法我得到1 125 899 96 842 624(缺少0)。这不仅仅是50 ...
当我遇到以下情况时会发生这种情况:
如何让这个算法更好?
答案 0 :(得分:2)
使用BigInteger
,它已包含在.Net Core中,或System.Runtime.Numerics Nuget Package中提供。
static string Efficient(int power)
{
var result = BigInteger.Pow(2, power);
return result.ToString(CultureInfo.InvariantCulture);
}
在我的机器上,NotEfficient
大约需要80毫秒,其中Efficient
需要0.3毫秒。您应该能够操纵该字符串(如果我正确理解您的问题陈述):
static string InsertCommas(string value)
{
var sb = new StringBuilder(value);
for (var i = value.Length - 4; i > 0; i -= 4)
{
sb.Insert(i, ',');
}
return sb.ToString();
}
答案 1 :(得分:1)