Truncatable primes: Difference between revisions

Content added Content deleted
(→‎{{header|Wren}}: Added libheader.)
m (Minor edit to C++ code)
Line 529: Line 529:
=={{header|C++}}==
=={{header|C++}}==
<lang cpp>#include <iostream>
<lang cpp>#include <iostream>
#include "sieve_of_eratosthenes.h"
#include "../library/sieve_of_eratosthenes.h"


bool is_left_truncatable(const sieve_of_eratosthenes& sieve, int p) {
int main()
for (int n = 10, q = p; p > n; n *= 10) {
{
if (!sieve.is_prime(p % n) || q == p % n)
return false;
q = p % n;
}
return true;
}

bool is_right_truncatable(const sieve_of_eratosthenes& sieve, int p) {
for (int q = p/10; q > 0; q /= 10) {
if (!sieve.is_prime(q))
return false;
}
return true;
}

int main() {
const int limit = 1000000;
const int limit = 1000000;


Line 541: Line 557:
int largest_right = 0;
int largest_right = 0;
// find largest left truncatable prime
// find largest left truncatable prime
for (int p = limit; p >= 2; --p)
for (int p = limit; p >= 2; --p) {
if (sieve.is_prime(p) && is_left_truncatable(sieve, p)) {
{
if (!sieve.is_prime(p))
continue;
bool left_truncatable = true;
for (int n = 10, q = p; p > n; n *= 10)
{
if (!sieve.is_prime(p % n) || q == p % n)
{
left_truncatable = false;
break;
}
q = p % n;
}
if (left_truncatable)
{
largest_left = p;
largest_left = p;
break;
break;
Line 562: Line 564:
}
}
// find largest right truncatable prime
// find largest right truncatable prime
for (int p = limit; p >= 2; --p)
for (int p = limit; p >= 2; --p) {
if (sieve.is_prime(p) && is_right_truncatable(sieve, p)) {
{
if (!sieve.is_prime(p))
continue;
bool right_truncatable = true;
for (int q = p/10; q > 0; q /= 10)
{
if (!sieve.is_prime(q))
{
right_truncatable = false;
break;
}
}
if (right_truncatable)
{
largest_right = p;
largest_right = p;
break;
break;