日期:2014-05-20 浏览次数:21218 次
/// <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出来了。。。
------解决方案--------------------