将阶乘序列显示为字符串

问题描述 投票:0回答:2

// 这是我的代码,用于查找数字的阶乘:

int get_factorial(int num)
{
   auto sum = 1;
   while(num > 0)
   {
       sum = sum * num;
       num--;
   }

   return sum;
}

// 这可以给我阶乘,但我的作业要我返回一个字符串。所以如果我的参数是 5,而不是像我的代码那样返回 120,我现在需要它返回一个字符串,上面写着“1x2x3x4x5 = 120”。 “5x4x3x2x1 = 120”也应该有效。

我不确定从哪里开始。我想也许可以创建一个字符串并在循环中附加每个总和,但我不知道该怎么做。

c++ string integer factorial function-definition
2个回答
3
投票

作业对你我这样的初学者来说并不容易。

我可以建议下面的演示程序中显示的以下解决方案。

#include <iostream>
#include <string>

std::string get_factorial( unsigned int n )
{
    std::string result;
    unsigned long long factorial = 1;

    while (n > 1)
    {
        result += std::to_string( n ) + 'x';
        factorial *= n--;
    }

    return result + std::to_string( n ) + " = " + std::to_string( factorial );
}

int main()
{
    for (unsigned int i = 0; i < 10; i++)
    {
        std::cout << get_factorial( i ) << '\n';
    }
}

程序输出为

0 = 1
1 = 1
2x1 = 2
3x2x1 = 6
4x3x2x1 = 24
5x4x3x2x1 = 120
6x5x4x3x2x1 = 720
7x6x5x4x3x2x1 = 5040
8x7x6x5x4x3x2x1 = 40320
9x8x7x6x5x4x3x2x1 = 362880

或者,该功能也可以像该演示程序中那样看起来像以下方式。

#include <iostream>
#include <string>

std::string get_factorial( unsigned int n )
{
    std::string result = std::to_string( n == 0 ? 0 : 1 );
    unsigned long long factorial = 1;

    for ( unsigned int i = 1; i++ < n; )
    {
        result += 'x' + std::to_string(i);
        factorial *= i;
    }

    return result  + " = " + std::to_string( factorial );
}

int main()
{
    for (unsigned int i = 0; i < 10; i++)
    {
        std::cout << get_factorial( i ) << '\n';
    }
}

程序输出为

0 = 1
1 = 1
1x2 = 2
1x2x3 = 6
1x2x3x4 = 24
1x2x3x4x5 = 120
1x2x3x4x5x6 = 720
1x2x3x4x5x6x7 = 5040
1x2x3x4x5x6x7x8 = 40320
1x2x3x4x5x6x7x8x9 = 362880

注意类型

unsigned long long int
可以存储
n
的阶乘的最大值等于
20
.


0
投票

您不需要 std::to_string(或 std::stringstream)。 您将要使用的数字只有这么多。所以,定义

   string digits = "0123456789";

然后用数字[n/10]或数字[n%10]挑出相关的字符。

无论如何,你可能只能达到 factorial(20)。

© www.soinside.com 2019 - 2024. All rights reserved.