用C ++计算大因子

时间:2010-01-20 00:45:14

标签: c++ integer factorial

我知道这是一个经典的编程问题,因此我想明确我不是在寻找代码作为解决方案,但我会欣赏正确的方向。我正在学习C ++,作为学习过程的一部分,我正在尝试一些编程问题。我正在尝试编写一个程序来处理数十亿的因子。显然,这些将是巨大的数字,并且太大而无法处理使用正常的算术运算。任何关于我应该在尝试解决这类问题时应该采取哪些方向的指示都将不胜感激。

如果可能的话,我宁愿尝试解决这个问题而不使用额外的库

由于

PS - 问题出在http://www.codechef.com/problems/FCTRL


以下是我用来解决问题的方法,这是通过阅读以下评论来实现的:

解决方案 - 数字5是以零结尾的任何数字的主要因子。因此,递归地将阶乘数除以5,并添加商,得到阶乘结果中的尾随零数

E.G。 - 126中的尾随零数! = 31

126/5 = 25余数1

25/5 = 5余数0

5/5 = 1余数0

25 + 5 + 1 = 31

这适用于任何值,只需保持分开直到商较小 比5

10 个答案:

答案 0 :(得分:7)

撇开这个问题,不确定我是否真的做对了,但这是一个演绎性猜测:

第一个问题 - 如何在数字结尾处获得零?乘以10。

你如何乘以10?通过乘以10或2 x 5 ......

所以,对于X!你有多少10s和2x5s ......?

(幸运的是2& 5是素数)

编辑:这是另一个提示 - 我认为你不需要做任何乘法。如果您需要其他提示,请告诉我。

答案 1 :(得分:3)

提示:您可能不需要计算N!为了在N的末尾找到零的数量!

答案 2 :(得分:3)

要解决这个问题,正如克里斯约翰逊所说,你必须要看0的数字。

因子10将是1,2,5,10本身。所以,你可以浏览每个N的数字!并用2 ^ x * 5 ^ y * 10 ^ z表示它们。放弃数字的其他因素。

现在答案将更大(x,y)+ z。

我从这个问题中学到的一件有趣的事情是,为了便于比较,最好用素数因子存储一个数的阶乘。

实际上,在RSA算法中有一种简单的方法,它不记得了。如果我找到,我会尝试更新帖子。

答案 3 :(得分:1)

这对你的问题不是一个好的答案,因为你已经从我最初阅读的内容进行了一些修改。但无论如何我都会把它留在这里来证明实际上试图通过主要蛮力进行计算是不切实际的。

任何bignum图书馆都将无法使用10亿个因子。这些数字将需要更多的空间来表示,而不是任何人在RAM中。当您处理它们时,您将不得不从存储中开始分页。有办法做到这一点。 guy who recently calculated π out to 2700 billion places使用了这样的库

答案 4 :(得分:1)

不要使用天真的方法。如果您需要计算阶乘,请使用快速算法:http://www.luschny.de/math/factorial/FastFactorialFunctions.htm

答案 5 :(得分:1)

我认为在开始考虑C ++或任何其他语言之前,你应该想出一种解决伪代码问题的方法。一些人指出的问题的本质更多的是算法问题而不是C ++问题。那些建议寻找一些不起眼的图书馆的人指向一个滑坡的方向,因为学习编程是学习如何思考,对吧?找到一个好的算法分析文本,它会很好地为您服务。在我们的部门,我们通过CLRS文本进行教学。

答案 6 :(得分:0)

为了让你开始,你应该将数字存储在某种类型的数组中,如std :: vector(数组中每个位置的数字),你需要找到一个算法来计算一个阶乘(可能在某种专业课)。 ;)

答案 7 :(得分:0)

您需要一个"big number"包 - 您使用的包或您自己编写的包。

我建议对"large number algorithms"进行一些研究。您将需要实现Java的BigDecimal的C ++等价物。

另一种看待它的方法是使用gamma function。您无需将所有这些值相乘即可得到正确的答案。

答案 8 :(得分:0)

要计算大因子,可以在C ++中使用此代码:

if let postImage = dict["thumbnail_images"] as? [[String: AnyObject]] {

            for img in postImage  {
                self.thumbnail_images.append(ThumbImages(dict: img))
            }
        }

由于long double包含大数据#include<iostream> using namespace std; long double factorial(int n); int main() { int n; cout << "Enter a positive integer: "; cin >> n; cout << "Factorial of " << n << " = " << factorial(n); return 0; } long double factorial(int n) { if(n > 1) return n * factorial(n - 1); else return 1; } ,因此该代码确实可以很好地运行!!

答案 9 :(得分:0)

    //SIMPLE FUNCTION TO COMPUTE THE FACTORIAL OF A NUMBER
    //THIS ONLY WORKS UPTO N = 65
    //CAN YOU SUGGEST HOW WE CAN IMPROVE IT TO COMPUTE FACTORIAL OF 400 PLEASE?     

    #include <iostream>
    #include <cmath>
    using namespace std;


    int factorial(int x);       //function to compute factorial described below

    int main()
        {
        int N; //= 150; //you can also get this as user input using cin.
        cout<<"Enter intenger\n";
        cin>>N;

        factorial(N);

        return 0;

        }//end of main




    int factorial(int x)        //function to compute the factorial
    {
     int i, n;
        long long unsigned results = 1;
        for (i = 1; i<=x; i++)
        {

        results = results * i;


        }

        cout<<"Factorial of "<<x<<" is "<<results<<endl;


        return results;
    }