17,740
社区成员
发帖
与我相关
我的任务
分享
大整数类型 底 指数(只支持整数)
public static BigInteger Pow(BigInteger baseValue, BigInteger exponent)
{
// 指数小于0的情况
if (exponent < 0)
throw new ArgumentOutOfRangeException("exponent", "NonNegative");
// 指数等与0的情况
if (exponent == 0)
{
return One;
}
// 当前的底
BigInteger integer = baseValue;
// 结果
BigInteger result = One;
// 当指数大于0
while (exponent > 0)
{
// 任何整数都能用二进制表示
// 如果指数的最后一位是1,那么结果*=当前的底
if ((exponent._data[0] & 1) != 0)
{
result *= integer;
}
// 如果指数就是1,那么就返回
if (exponent == 1)
{
return result;
}
// 当前底=当前底的平方
integer = integer.Square();
// 指数=指数右移1位
exponent = RightShift(exponent, 1);
}
return result;
}
public struct BigInteger
{
private short _sign;
private uint[] _data;
public static BigInteger Pow(BigInteger baseValue, BigInteger exponent)
{
if (exponent < 0)
throw new ArgumentOutOfRangeException("exponent", "NonNegative");
if (exponent == 0)
{
return One;
}
BigInteger integer = baseValue;
BigInteger result = One;
while (exponent > 0)
{
if ((exponent._data[0] & 1) != 0)
{
result *= integer;
}
if (exponent == 1)
{
return result;
}
integer = integer.Square();
exponent = RightShift(exponent, 1);
}
return result;
}
// other members, implement *, Square, RightShift, One (value is 1)
}
int* multiplication(int *Result, const int len, const int *Source, const int lenght)
{
int i = 0;
int j = 0;
int temp[MAX_BIT] = {0};//临时储存
int array = 0;//进位
for (i=0; i<lenght; i++)
{
for (j=0; j<len; j++)
{
if (0 == i)
temp[j+i] = Result[j] * Source[i] + array;
else
temp[j+i] += Result[j] * Source[i] + array;
array = temp[j+i]/10;
temp[j+i] %= 10;
}
}
memcpy(Result, temp, len*sizeof(int));
return Result;
}