Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算2^(n),其中0<;n<;10000_C#_Algorithm - Fatal编程技术网

C# 计算2^(n),其中0<;n<;10000

C# 计算2^(n),其中0<;n<;10000,c#,algorithm,C#,Algorithm,这就是我要解决的问题: 我想计算2^(n),其中0

这就是我要解决的问题:

我想计算2^(n),其中0 我将数组的每个元素表示为一个空间,其中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;
}
静态字符串NotEfficient(整数幂)
{
如果(功率<0)
抛出新异常(“电源不应为负”);
如果(功率==0)
返回“1”;
如果(功率==1)
返回“2”;
int[]A=新int[3750];
int current4Digit=0;
//首先,2写入数组的第一个元素
A[current4Digit]=2;
int currentPower=1;
while(电流功率<功率)
{
//每4位数乘以2
对于(int i=0;i current4Digit)
{
current4Digit++;
}
}
}
}
//从数组中获取数据以生成答案
字符串答案=”;
对于(int i=current4Digit;i>=0;i--)
{
答案+=A[i].ToString()+“,”;
}
返回答案;
}
我的问题是,它不能正确显示数字,实际上它包含0。例如,2^(50)=112589906842624,使用我的算法,我得到112589996842624(缺少0)。这不仅仅是为了50个人

例如,当我遇到以下情况时,就会发生这种情况:


如何改进此算法?

解决此问题的一种方法是,如果四位数小于四位数,则使用前导零填充四位数:

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

return answer.TrimStart('0'); 

使用
biginger
,它已包含在.Net核心中或在中提供

在我的机器上,
NotEfficient
大约需要80ms,其中
Efficient
需要0.3ms。您应该能够操作该字符串(如果我正确理解您的问题陈述):


如果需要,您可以在字符串的左侧填充
0
字符(如果字符串需要加长,该方法将获取所需的全部字符和用于填充的字符)。例如:
answer+=A[i].ToString().PadLeft(4,'0')+“,”
然后可以使用从结果中删除任何前导零:
返回answer.TrimStart('0')是,但它会使代码更复杂?不是吗?我不这么认为?它没有添加更多的代码行或任何逻辑,只是另一个返回字符串的方法调用。你是对的,它是有效的,但我认为算法可能需要改进..说得很清楚,你正在尝试计算2到n,并以10为底,对吗?因为我得告诉你,如果你用二进制渲染,这个问题会容易得多。:-)我会把战俘换成左班
return answer.TrimStart('0'); 
static string Efficient(int power)
{
    var result = BigInteger.Pow(2, power);
    return result.ToString(CultureInfo.InvariantCulture);
}
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();
}