//下面是我的代码,用来查找一个数的阶乘:
int get_factorial(int num)
{
auto sum = 1;
while(num > 0)
{
sum = sum * num;
num--;
}
return sum;
}
//这个函数可以给予我阶乘,但是我的赋值语句要我返回一个字符串。所以如果我的参数是5,而不是像我的代码现在那样返回120,我需要它返回一个字符串,表示“1x 2x 3x 4x 5 = 120”。“5x 4x 3x 2x 1 = 120”也应该可以。
我不知道从哪里开始,我想也许可以创建一个字符串,然后在它通过循环时附加每个和,但我不知道如何做到这一点。
3条答案
按热度按时间5rgfhyps1#
这个作业对于像你我这样的初学者来说并不容易。:)
我可以建议下面的演示程序中显示的解决方案。
程序输出为
或者,该函数也可以看起来像演示程序中的以下方式。
程序输出为
注意
unsigned long long int
类型可以存储n
等于20
的阶乘的最大值。bvjxkvbb2#
在C23中,您可以使用C视图和范围轻松地完成此操作:
std::views::iota(begin, end)
生成从包含begin
到排除end
的值。使用
std::views::iota(1)
可以创建一个从1
开始的值的无穷序列。(注意视图是延迟求值的!)std::views::take(num)
使num
在到达num
后停止生成。您可以使用std::views::iota(1, num + 1)
完成相同的操作。std::views::transform
通过lambda调用std::to_string
将int
值转换为std::string
。或者,您可以直接向函数传递引用或指针,但由于std::to_string
有多个重载,因此必须通过static_cast
选择int
重载。或者,您可以直接向函数传递引用或指针。但是因为std::to_string
有多个重载,int
重载必须通过static_cast
来选择。这比lambda的可读性差,但是至少更有效,因为lambda在C20之前总是创建一个空对象。从C23开始,你可以通过将函数操作符定义为静态函数来禁止在没有捕获的情况下为lambda创建对象。2这和强制转换一样有效。(Note:默认情况下,使无捕获的lambdas
static
会破坏向后兼容性。)std::views::join_with
将std::string
展开为char
序列,并在这些序列之间添加'x'
。结果是char
的长序列,其中包含要创建的字符序列。std::ranges::copy
将此char
序列复制到std::cout
。join_with
视图是C23,其他视图是C20。如果你坚持使用比C++23更老的标准,或者你只是不想使用视图和范围的方法,你可以实现print函数如下:
实际上,这种实现可能更好,因为它不太复杂,而且效率更高(另一种方法使用
std::to_string
,可能比较慢)。然而,这个问题非常适合于演示视图和范围的使用,因此详细描述了这种方法。- )
wj8zmpe13#
你不需要std::to_string(或者std::stringstream),你要用的数字就这么多,所以,定义
并使用数字[n/10]或数字[n%10]挑选相关字符。
你可能只能做阶乘(20)。