因子,数十和单位

时间:2016-08-02 19:39:06

标签: c++

嗨,伙计们,我正在尝试编写一个程序,它将计算通过数的阶乘数并显示他的数十和单位。这个练习来自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;
}

2 个答案:

答案 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个,你也可以只打印一个数组的结果。