谁能帮我编一个求 n!的程序 用面向对象。谢谢
class live41 { public: live41(int n); { n*=n++; } }; void main() { int n; cin>>n; live41 Queenie(n) }
以上代码有错,至于哪里错了,请你自己改回来吧!
[此贴子已经被作者于2004-10-03 17:48:15编辑过]
我们知道任何数据类型都有其数据上限,n 阶乘,就很有可能突破 Integer 的数据上限,为了解决这个问题,我们可以动态开辟内存,设计3个 integer array, 一个用于存放乘数,一个用于存放被乘数,一个用于存放计算结果。
假设我们已经解决了 任意两个数相乘 的问题, 那么 n 阶乘 的问题就解决了。
现在的问题是如何解决 任意两个数相乘 的问题?
我的算法如下,先将两个数转化为 2的米 的和, 比如:
56 * 10 = (32 + 16 +8)* (8+2)= 32*8 + 16*8 + 8*8 + 32*2 + 16*2 + 8*2 = 32 <<2 + 16<<2 + 8<<2 + 32<<1 +16<<1+ 8<<1 这样的话,在子程序中动态开辟5个 integer array, 在每个 array 中以二进制形式存放数据 32 16 8 8 和2 再通过移位的方式得出中间计算结果,再相加。最后得出 a*b 的结果。有了 a*(a-1), 然后再以 a*(a-1) 的结果和 (a-2) 相乘, 最终得出 a 的阶乘(这个时候还是 2 进制的形式,也就是说,他们还是 0, 1 的组合,于结果这个 array 中,最后我们将这个 2 进制 转化为 10 进制。然后输出,这样你便看到 任何一个数的 阶乘的结果了。
我们知道任何数据类型都有其数据上限,n 阶乘,就很有可能突破 Integer 的数据上限,为了解决这个问题,我们可以动态开辟内存,设计3个 integer array, 一个用于存放乘数,一个用于存放被乘数,一个用于存放计算结果。
假设我们已经解决了 任意两个数相乘 的问题, 那么 n 阶乘 的问题就解决了。
现在的问题是如何解决 任意两个数相乘 的问题?
我的算法如下,先将两个数转化为 2的米 的和, 比如:
56 * 10 = (32 + 16 +8)* (8+2)= 32*8 + 16*8 + 8*8 + 32*2 + 16*2 + 8*2 = 32 <<2 + 16<<2 + 8<<2 + 32<<1 +16<<1+ 8<<1 这样的话,在子程序中动态开辟5个 integer array, 在每个 array 中以二进制形式存放数据 32 16 8 8 和2 再通过移位的方式得出中间计算结果,再相加。最后得出 a*b 的结果。有了 a*(a-1), 然后再以 a*(a-1) 的结果和 (a-2) 相乘, 最终得出 a 的阶乘(这个时候还是 2 进制的形式,也就是说,他们还是 0, 1 的组合,于结果这个 array 中,最后我们将这个 2 进制 转化为 10 进制。然后输出,这样你便看到 任何一个数的 阶乘的结果了。
kai很耐心很详细啊,不过<<是什么运算符?看不懂啊!