日期:2014-05-20 浏览次数:21534 次
/// <summary>
/// 将传入的因数X,因数Y的Dictionary中的元素循环进行相乘.
/// </summary>
/// <param name="FactorX">因数X</param>
/// <param name="FactorY">因数Y</param>
/// <returns>乘积结果的Dictionary</returns>
static Dictionary<int, int> GetProduct(Dictionary<int, int> FactorX
, Dictionary<int, int> FactorY)
{
Dictionary<int, int> ret = new Dictionary<int, int>(); //乘积,返回结果
int Carry = 0; //进位数
int Product = 0; //乘积
int Position = 0; //位数
int Number = 0; //乘积 % 10 取余的余数
int TempNumber = 0; //旧值
//循环历遍因数X中的元素
foreach (KeyValuePair<int, int> kvpFactorX in FactorX)
{
//清除进位数
Carry = 0;
//循环历遍因数Y中的元素
foreach (KeyValuePair<int, int> kvpFactorY in FactorY)
{
//取得乘积,例如 9 * 9 = 81
Product = kvpFactorY.Value * kvpFactorX.Value;
//取得位数,例如 因数X的第1位 * 因数Y的第1位,那么其乘积所在开始的位数则为2,
//比如 20 * 30 中两个十位数相乘其结果
//开始的位数为(2所在位数为1 + 3所在位数为1) = 6所在位数为2,即是600
Position = kvpFactorX.Key + kvpFactorY.Key;
//取得乘积 % 10 取余的余数
Number = Product % 10;
//判断乘积结果中该位是否有值,有值则相加,否则插入
if (ret.Keys.Contains(Position))
{
//临时存放旧值
TempNumber = ret[Position];
//更新当前位的值,当前位值 = (旧值 + 取得乘积 % 10 取余的余数 + 上一次进位数) % 10 取余
ret[Position] = (TempNumber + Number + Carry) % 10;
//取得当前进位值,當前進位值 = (旧值 + 乘积 + 进位)/10 取整
Carry = (int)Math.Floor((TempNumber + Product + Carry) / 10.0);
}
else
{
//插入位数,值
ret.Add(Position, (Number + Carry) % 10);
//取得当前进位值,當前進位值 = (乘积 + 进位)/10 取整
Carry = (int)Math.Floor((Product + Carry) / 10.0);
}
}
//当最后进位数不为0时,需要新增最高位,其值为进位数
if (Carry != 0) ret.Add(ret.Keys.Max() + 1, Carry);
}
return ret;
}
def f(n)
i = 1
while n > 0
i *= n
n -= 1
end
return i
end
puts f(1000)
------解决方案--------------------
10000的阶乘,我没有精确计时,我只是心里默念1秒,2秒,居然在第六秒的时候就IO出来了。。。
------解决方案--------------------