Left factorials: Difference between revisions
Content added Content deleted
(Alternative Rust solution) |
(Added alternative C++ solution) |
||
Line 739: | Line 739: | ||
!9000 has 31678 digits. |
!9000 has 31678 digits. |
||
!10000 has 35656 digits. |
!10000 has 35656 digits. |
||
</pre> |
|||
===Faster alternative=== |
|||
{{libheader|GMP}} |
|||
<lang cpp>#include <iostream> |
|||
#include <gmpxx.h> |
|||
template <typename integer> |
|||
class left_factorial_generator { |
|||
public: |
|||
integer next() { |
|||
integer result = next_; |
|||
next_ += factorial_; |
|||
factorial_ *= n_++; |
|||
return result; |
|||
} |
|||
private: |
|||
unsigned int n_ = 1; |
|||
integer factorial_ = 1; |
|||
integer next_ = 0; |
|||
}; |
|||
int main() { |
|||
left_factorial_generator<mpz_class> lf; |
|||
int i = 0; |
|||
std::cout << "Left factorials 0 through 10:\n"; |
|||
for (; i <= 10; ++i) |
|||
std::cout << "!" << i << " = " << lf.next() << '\n'; |
|||
std::cout << "Left factorials 20 through 110, by tens:\n"; |
|||
for (; i <= 110; ++i) { |
|||
auto n = lf.next(); |
|||
if (i % 10 == 0) |
|||
std::cout << "!" << i << " = " << n << '\n'; |
|||
} |
|||
std::cout << "Lengths of left factorials 1000 through 10000, by thousands:\n"; |
|||
for (; i <= 10000; ++i) { |
|||
auto n = lf.next(); |
|||
if (i % 1000 == 0) |
|||
std::cout << "length of !" << i << " = " << n.get_str().size() << '\n'; |
|||
} |
|||
return 0; |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Left factorials 0 through 10: |
|||
!0 = 0 |
|||
!1 = 1 |
|||
!2 = 2 |
|||
!3 = 4 |
|||
!4 = 10 |
|||
!5 = 34 |
|||
!6 = 154 |
|||
!7 = 874 |
|||
!8 = 5914 |
|||
!9 = 46234 |
|||
!10 = 409114 |
|||
Left factorials 20 through 110, by tens: |
|||
!20 = 128425485935180314 |
|||
!30 = 9157958657951075573395300940314 |
|||
!40 = 20935051082417771847631371547939998232420940314 |
|||
!50 = 620960027832821612639424806694551108812720525606160920420940314 |
|||
!60 = 141074930726669571000530822087000522211656242116439949000980378746128920420940314 |
|||
!70 = 173639511802987526699717162409282876065556519849603157850853034644815111221599509216528920420940314 |
|||
!80 = 906089587987695346534516804650290637694024830011956365184327674619752094289696314882008531991840922336528920420940314 |
|||
!90 = 16695570072624210767034167688394623360733515163575864136345910335924039962404869510225723072235842668787507993136908442336528920420940314 |
|||
!100 = 942786239765826579160595268206839381354754349601050974345395410407078230249590414458830117442618180732911203520208889371641659121356556442336528920420940314 |
|||
!110 = 145722981061585297004706728001906071948635199234860720988658042536179281328615541936083296163475394237524337422204397431927131629058103519228197429698252556442336528920420940314 |
|||
Lengths of left factorials 1000 through 10000, by thousands: |
|||
length of !1000 = 2565 |
|||
length of !2000 = 5733 |
|||
length of !3000 = 9128 |
|||
length of !4000 = 12670 |
|||
length of !5000 = 16322 |
|||
length of !6000 = 20062 |
|||
length of !7000 = 23875 |
|||
length of !8000 = 27749 |
|||
length of !9000 = 31678 |
|||
length of !10000 = 35656 |
|||
</pre> |
</pre> |
||