嗨,伙计们,我正在尝试编写一个程序,它将计算通过数的阶乘数并显示他的数十和单位。这个练习来自spoj.com但显然我的代码太慢而且spoj的编译器说我超过了时间限制..:/任何想法如何加速这段代码? :)我添加了一些评论,试图简化你对我的代码的理解。 #UPDATE。我重新组织了我的代码,它的工作也很好但是更短;)
#include <iostream>
#include <cmath>
using namespace std;
int tests, number, result = 1, units, tens, auxiliary;
//PROGRAM IS CALCULATING FACTORIAL AND WRITING OUT THE NUMBER OF TENS AND UNITS
int main()
{
cin >> tests; // number of integers you want to check, for example if you cin >> 5 then you have 5 numbers to check the answer
for (int i = 0; i < tests;i++) // imputation of integers to tables
{
cin >> number;
result = 1;
auxiliary = number;
for(int i=0;i<auxiliary;i++)
{
result = result * number;
number -= 1;
}
units = result % 10; // here I calculate units
tens = result % 100; // here I calculate number of tens
tens = (tens - units) / 10; // here I calculate number of tens #2
cout << tens <<" "<< units << endl; // here I write out the answer which has the form "x y" <---- "tens units"
tens = 0;
units = 0;
}
return 0;
}
答案 0 :(得分:2)
目前,让我们假设你想要实际计算一个有意义的结果,而不只是预先计算变化的少数结果,并为所有其他输入存储一个固定的结果。
如果你正在进行计算,那么你正在处理模运算。也就是说,对于某些(整数)输入集合,您正在执行A * B * C ... mod M
。我们可以观察到的是,它的模数部分是可分配的。例如,如果任何输入可能大于我们的模数(M),我们可以改变:
A * B mod M
成:
((A mod M) * (B mod M) mod M)
......仍然得到相同的结果。我们也可以对所有中间结果做同样的事情,因此对于一些任意数量的输入:
A * B * C * D * E [...] mod M
可以成为:
intermediate = A mod M;
for (V in A, B, D, E [...])
intermediate *= V mod M;
intermediate = intermediate mod M;
......仍然得到相同的结果。
这意味着我们必须处理的最大数量是大约M 2 。在你的情况下,M = 100,所以我们永远不必代表任何大于10000的数字。这意味着它总是适合int
(因为它保证至少支持16位数字。
通过这种方式利用模运算,我们可以更快地进行乘法多。更有趣的是,这种基本技术扩展到了很多有趣的案例,而不仅仅是这个案例(例如,它在实施RSA加密/解密时经常使用)。
答案 1 :(得分:0)
以下是前20个阶乘:
1
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
2432902008176640000
你实际上并不需要为任何大于10的数字计算阶乘,因为你的答案总是0,0。对于其他10个,你也可以只打印一个数组的结果。