83 lines
2.3 KiB
Java
83 lines
2.3 KiB
Java
public class SmarandachePrimeDigitalSequence {
|
|
|
|
public static void main(String[] args) {
|
|
long s = getNextSmarandache(7);
|
|
System.out.printf("First 25 Smarandache prime-digital sequence numbers:%n2 3 5 7 ");
|
|
for ( int count = 1 ; count <= 21 ; s = getNextSmarandache(s) ) {
|
|
if ( isPrime(s) ) {
|
|
System.out.printf("%d ", s);
|
|
count++;
|
|
}
|
|
}
|
|
System.out.printf("%n%n");
|
|
for (int i = 2 ; i <=5 ; i++ ) {
|
|
long n = (long) Math.pow(10, i);
|
|
System.out.printf("%,dth Smarandache prime-digital sequence number = %d%n", n, getSmarandachePrime(n));
|
|
}
|
|
}
|
|
|
|
private static final long getSmarandachePrime(long n) {
|
|
if ( n < 10 ) {
|
|
switch ((int) n) {
|
|
case 1: return 2;
|
|
case 2: return 3;
|
|
case 3: return 5;
|
|
case 4: return 7;
|
|
}
|
|
}
|
|
long s = getNextSmarandache(7);
|
|
long result = 0;
|
|
for ( int count = 1 ; count <= n-4 ; s = getNextSmarandache(s) ) {
|
|
if ( isPrime(s) ) {
|
|
count++;
|
|
result = s;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static final boolean isPrime(long test) {
|
|
if ( test % 2 == 0 ) return false;
|
|
for ( long i = 3 ; i <= Math.sqrt(test) ; i += 2 ) {
|
|
if ( test % i == 0 ) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private static long getNextSmarandache(long n) {
|
|
// If 3, next is 7
|
|
if ( n % 10 == 3 ) {
|
|
return n+4;
|
|
}
|
|
long retVal = n-4;
|
|
|
|
// Last digit 7. k = largest position from right where we have a 7.
|
|
int k = 0;
|
|
while ( n % 10 == 7 ) {
|
|
k++;
|
|
n /= 10;
|
|
}
|
|
|
|
// Determine first digit from right where digit != 7.
|
|
long digit = n % 10;
|
|
|
|
// Digit is 2, 3, or 5. 3-2 = 1, 5-3 = 2, 7-5 = 2, so digit = 2, coefficient = 1, otherwise 2.
|
|
long coeff = (digit == 2 ? 1 : 2);
|
|
|
|
// Compute next value
|
|
retVal += coeff * Math.pow(10, k);
|
|
|
|
// Subtract values for digit = 7.
|
|
while ( k > 1 ) {
|
|
retVal -= 5 * Math.pow(10, k-1);
|
|
k--;
|
|
}
|
|
|
|
// Even works for 777..777 --> 2222...223
|
|
return retVal;
|
|
}
|
|
|
|
}
|