2016-07-28 51 views
2

我刚刚开始使用D,并试图在D中编写一个简单的析因程序。有没有类似D中C++的向量?我想使用矢量来创建一个动态函数来计算阶乘。D语言中的析因

+3

我没有使用过D lang,但是您是否参考了[documentation](https://dlang.org/spec/spec.html)?它在文档中提到了有关动态数组[a](https://dlang.org/spec/arrays.html#dynamic-arrays)的内容。 –

回答

2

在D中,动态数组可以调整大小,并且可以连接,就像C++中的矢量一样。 这里是与这种阵列的例子,其从stdin读取和写入stdout

import std.stdio; // for readf and writeln 

void main() // void for main means "int with return 0 at exit" to OS 
{ 
    int n; 
    readf (" %s", &n); // skip whitespace, then read int in default format 
    auto f = [1]; // a dynamic array of int containing a 1 
    foreach (i; 1..n + 1) // for i = 1, 2, 3, ..., n - 1, n 
    { 
     f ~= f[$ - 1] * i; // append to f its last element multiplied by i 
    } 
    writeln (f); // print the dynamic array in default format 
} 

对于输入

10 

输出为:

[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800] 

作为评价所提到的,有关内置动态数组的更多信息,请参阅the documentation


但是,目前尚不清楚什么是动态功能你提到。通常,我们不需要数组或向量来计算阶乘。 检查RosettaCode的几个其他方法来计算D的阶乘。

+0

范围(发生器)的完美候选... – DejanLekic

+0

@DejanLekic:是的,因数是事实上[std.range.recurrence]的一个例子(https://dlang.org/library/std/range/recurrence的.html)。但是,这个问题涉及数组出于某种原因。 – Gassa

2

为什么不使用std.bigint? - 它针对任意精度数值进行了优化。即使使用ulong2^64),也只能计算20阶乘因子,对于此用例,内联表可能更有意义。下面是与BigInt一个例子:

import std.bigint : BigInt; 

BigInt factorial(int n) 
{ 
    auto b = BigInt(1); 
    foreach (i; 1..n + 1) 
     b *= i; 
    return b; 
} 

void main() 
{ 
    import std.stdio : writeln; 
    factorial(10).writeln; // 3628800 
    factorial(100).writeln; // 9.33 * 10^157 
} 

如果您想了解更多关于动态数组,也许DLang游页ArraysSlices可以帮助你?