计算2 ^(n)其中0 <n <10000

时间:2018-06-05 20:56:21

标签: c# algorithm

=“”

所以,这是我要解决的问题:

我想计算2 ^(n)其中0&lt; N'LT; 10000

我将数组的每个元素表示为一个空格,其中4位数应为&#34;生活&#34;如果出现额外的数字,我将它替换为该数组的下一个元素。

我使用的原则如下:

enter image description here

我使用的代码如下:

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 ...

当我遇到以下情况时会发生这种情况:

enter image description here

如何让这个算法更好?

2 个答案:

答案 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)

解决此问题的一种方法是使用PadLeft方法填充4位数的前导零(如果它们少于4位数):

answer += A[i].ToString().PadLeft(4, '0') + ","; 

然后您可以使用TrimStart方法从最终结果中删除任何前导零:

return answer.TrimStart('0'); 
相关问题