이경수 선생님의 수학실험실

Problem 41(Pandigital prime) 본문

Project Euler

Problem 41(Pandigital prime)

(이경수) 2019. 6. 16. 23:26

Problem 41(Pandigital prime)

We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once. For example, 2143 is a 4-digit pandigital and is also prime.

What is the largest n-digit pandigital prime that exists?

 

In Python:

import math
import time

def isprime(n):
    if n == 0 or n == 1:
        return False
    else:
        for i in range(2, n):
            if n % i == 0:
                return False
        return True

def swap(s, i, j):
    nList = list(s)
    nList[j], nList[i] = nList[i], nList[j]
    return ''.join(nList)

def undersort(s, i):
    nList = list(s)
    nList = nList[0: i] + sorted(nList[i:])
    return ''.join(nList)

def lexico(nStr):
    lenStr = len(nStr)
    for i in range(lenStr - 2, -1, -1):
        for j in range(lenStr - 1, i, -1):
            if int(nStr[i]) < int(nStr[j]):
                nStr = swap(nStr, i, j)
                nStr = undersort(nStr, i + 1)
                return nStr

startTime = time.time()
nStr = '1234567'
cStr = math.factorial(len(nStr))
panList = [1234567]
for i in range(1, cStr):
    nStr = lexico(nStr)
    panList.append(int(nStr))
for i in range(cStr, 1, -1):
    if isprime(panList[i - 1]):
            print(panList[i - 1])
            break
print(time.time() - startTime, "seconds")

Run time: 0.7171950340270996 seconds

 

In Java:

package project_euler41_50;

import java.util.ArrayList;
import java.util.Collections;

public class Euler41 {
	public static Boolean isprime(int n) {
		if (n == 0 || n == 1) {
			return false;
		} else {
			for (int i = 2; i < n; i++) {
				if (n % i == 0) {
					return false;
				}
			}
			return true;
		}
		
	}
	public static int factorial(int n) {
		if (n == 1) {
			return 1;
		}
		return n * factorial(n - 1);
	}
	public static String swap(String s, int i, int j) {
		int temp;
		String nstr="";
		String nData[];
		ArrayList<Integer> nList = new ArrayList<Integer>();
		nData = s.split("");
		for (int k = 0; k < nData.length; k++) {
			nList.add(Integer.parseInt(nData[k]));
		}
		temp = nList.get(i);
		nList.set(i, nList.get(j));
		nList.set(j, temp);
		for (int num : nList) {
			nstr += Integer.toString(num);
		}
		return nstr;
	}
	public static String undersort(String s, int i) {
		String nstr = "";
		String nData[];
		ArrayList<Integer> nList1 = new ArrayList<Integer>();
		ArrayList<Integer> nList2 = new ArrayList<Integer>();
		nData = s.split("");
		for (int k = 0; k < i; k++) {
			nList1.add(Integer.parseInt(nData[k]));
		}
		for (int k = i; k < nData.length; k++) {
			nList2.add(Integer.parseInt(nData[k]));
		}
		Collections.sort(nList2);
		nList1.addAll(nList2);
		for (int num : nList1) {
			nstr += Integer.toString(num);
		}
		return nstr;
	}
	public static String lexico(String s) {
		int check = 0;
		int lenStr = s.length();
		String nStr = "";
		String nData[];
		ArrayList<Integer> nList = new ArrayList<Integer>();
		nData = s.split("");
		for (int k = 0; k < nData.length; k++) {
			nList.add(Integer.parseInt(nData[k]));
		}
		for (int i = lenStr - 2; i > -1; i--) {
			for (int j = lenStr - 1; j > i; j--) {
				if (nList.get(i) < nList.get(j)) {
					nStr = swap(s, i, j);
					nStr = undersort(nStr, i + 1);
					check = 1;
					break;
				}
			}
			if (check == 1) {
				break;
				
			}
		}
		return nStr;
	}
	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		String nStr = "1234567";
		int cStr = factorial(nStr.length());
		ArrayList<Integer> panList = new ArrayList<Integer>();
		panList.add(1234567);
		for (int i = 1; i < cStr; i++) {
			nStr = lexico(nStr);
			panList.add(Integer.parseInt(nStr));
		}
		for (int i = cStr; i > 1; i--) {
			if (isprime(panList.get(i - 1))) {
				System.out.println(panList.get(i - 1));
				break;
			}
		}
		long endTime = System.currentTimeMillis();
		System.out.println((double)(endTime - startTime)/(double)1000 + "seconds");
	}
}

Run time: 0.253seconds

 

Solution: 7652413

'Project Euler' 카테고리의 다른 글

Problem 43(Sub-string divisibility)  (0) 2019.07.24
Problem 42(Coded triangle numbers)  (0) 2019.07.24
Problem 40(Champernowne's constant)  (0) 2019.06.16
Problem 39(Integer right triangles)  (0) 2019.06.16
Problem 38(Pandigital multiples)  (0) 2019.06.15
Comments