Equal prime and composite sums: Difference between revisions
Content added Content deleted
m (→{{header|Phix}}: slightly simpler and faster (no need for that +3)) |
(Added C++ solution) |
||
Line 31: | Line 31: | ||
=={{header|C++}}== |
|||
{{libheader|Primesieve}} |
|||
<lang cpp>#include <primesieve.hpp> |
|||
#include <chrono> |
|||
#include <iomanip> |
|||
#include <iostream> |
|||
#include <locale> |
|||
class composite_iterator { |
|||
public: |
|||
composite_iterator(); |
|||
uint64_t next_composite(); |
|||
private: |
|||
uint64_t composite; |
|||
uint64_t prime; |
|||
primesieve::iterator pi; |
|||
}; |
|||
composite_iterator::composite_iterator() { |
|||
composite = prime = pi.next_prime(); |
|||
for (; composite == prime; ++composite) |
|||
prime = pi.next_prime(); |
|||
} |
|||
uint64_t composite_iterator::next_composite() { |
|||
uint64_t result = composite; |
|||
while (++composite == prime) |
|||
prime = pi.next_prime(); |
|||
return result; |
|||
} |
|||
int main() { |
|||
std::cout.imbue(std::locale("")); |
|||
auto start = std::chrono::high_resolution_clock::now(); |
|||
composite_iterator ci; |
|||
primesieve::iterator pi; |
|||
uint64_t prime_sum = pi.next_prime(); |
|||
uint64_t composite_sum = ci.next_composite(); |
|||
uint64_t prime_index = 1, composite_index = 1; |
|||
std::cout << "Sum | Prime Index | Composite Index\n"; |
|||
std::cout << "------------------------------------------------------\n"; |
|||
for (int count = 0; count < 11;) { |
|||
if (prime_sum == composite_sum) { |
|||
std::cout << std::right << std::setw(21) << prime_sum << " | " |
|||
<< std::setw(12) << prime_index << " | " << std::setw(15) |
|||
<< composite_index << '\n'; |
|||
composite_sum += ci.next_composite(); |
|||
prime_sum += pi.next_prime(); |
|||
++prime_index; |
|||
++composite_index; |
|||
++count; |
|||
} else if (prime_sum < composite_sum) { |
|||
prime_sum += pi.next_prime(); |
|||
++prime_index; |
|||
} else { |
|||
composite_sum += ci.next_composite(); |
|||
++composite_index; |
|||
} |
|||
} |
|||
auto end = std::chrono::high_resolution_clock::now(); |
|||
std::chrono::duration<double> duration(end - start); |
|||
std::cout << "\nElapsed time: " << duration.count() << " seconds\n"; |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Sum | Prime Index | Composite Index |
|||
------------------------------------------------------ |
|||
10 | 3 | 2 |
|||
1,988 | 33 | 51 |
|||
14,697 | 80 | 147 |
|||
83,292 | 175 | 361 |
|||
1,503,397 | 660 | 1,582 |
|||
18,859,052 | 2,143 | 5,699 |
|||
93,952,013 | 4,556 | 12,821 |
|||
89,171,409,882 | 118,785 | 403,341 |
|||
9,646,383,703,961 | 1,131,142 | 4,229,425 |
|||
209,456,854,921,713 | 5,012,372 | 19,786,181 |
|||
3,950,430,820,867,201 | 20,840,220 | 86,192,660 |
|||
Elapsed time: 0.330966 seconds |
|||
</pre> |
|||
=={{header|F_Sharp|F#}}== |
=={{header|F_Sharp|F#}}== |