洛谷:P1591:阶乘数码


洛谷:P1591:阶乘数码

Table of Contents

题目

P1591:阶乘数码

分析

基于我们之前的高精度基础,特别是P1303:A*B Problem,我们可以很快解决这个问题。

不过有一个小的改动,由于我们声明的高精度类中,保留计算结果的数组num是私有变量(private),所以在类之外是无法访问的。所以我们要增加一个getter

class HighPrecision
{
    friend istream& operator>>(istream& is, HighPrecision& hp);
    friend ostream& operator<<(ostream& os, const HighPrecision& hp);
    friend HighPrecision operator+(const HighPrecision& hp1,
                                   const HighPrecision& hp2);
    friend HighPrecision operator*(const HighPrecision& hp1,
                                   const HighPrecision& hp2);

   private:
    vector<int> num;

   public:
    HighPrecision() {}
    HighPrecision(const string& s)
    {
        for (int i = s.size() - 1; i >= 0; i--)
            num.push_back(s[i] - '0');
    }

    // 新增一个getter
    vector<int> getNum() const
    {
        return num;
    }
};

然后我们就可以简单地先算出阶乘,然后遍历结果数组,分别统计即可。

答案

思考

请注意本题中阶乘计算时,声明乘数的方式:

HighPrecision result("1");
for (int i = 1; i <= n; i++)
{
    HighPrecision hp(to_string(i));
    result = result * hp;
}

也就是我们要将当前的乘数(i)转化为字符串。

Previous Next