C# 计算2^(n),其中0<;n<;10000
这就是我要解决的问题: 我想计算2^(n),其中0C# 计算2^(n),其中0<;n<;10000,c#,algorithm,C#,Algorithm,这就是我要解决的问题: 我想计算2^(n),其中0
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();
}