Pages

Showing posts with label Euler Problem 30-39. Show all posts
Showing posts with label Euler Problem 30-39. Show all posts

Wednesday, September 9, 2009

Euler Problem 39 solution

Time (s): ~0.009
package margusmartseppcode.From_30_to_39;

public class Problem_39 {
 // Pythagorean theorem for right angle triangle:
 // a*a+b*b==c*c where c=(p-a-b)
 // same as (MOD(p(p–2a),2(p-a))== 0)
 public static void main(String[] args) {
  int max = 0, limit = 1000, imax = 0;

  for (int i = 2; i <= limit; i += 2)
   for (int j = 2, t = 0; j <= i / 4; j++) {
    if (i * (i - 2 * j) % (2 * (i - j)) == 0)
     t++;
    if (t > imax) {
     imax = t;
     max = i;
    }
   }

  System.out.println(max);
 }
}

Euler Problem 38 solution

Time (s): ~0.012
package margusmartseppcode.From_30_to_39;

import java.util.HashSet;
import java.util.Set;

public class Problem_38 {
 static final int nbrs = 9;

 static boolean isPandigital(String s) {
  return isPandigital(s, nbrs);
 }

 static boolean isPandigital(String s, int nr) {
  if (s.length() != nr)
   return false;

  Set<Character> set = new HashSet<Character>();
  for (int i = 0; i < nr; i++)
   set.add(s.charAt(i));

  if (set.size() != nr)
   return false;
  if (set.contains('0'))
   return false;
  return true;
 }

 public static void main(String[] args) {
  String maxPan = "";
  for (int i = 9876; i > 9123; i--)
   if (isPandigital(maxPan = "" + i + (i + i)))
    break;
  System.out.println(maxPan);
 }
}

Euler Problem 37 solution

Time (s): ~0.599
package margusmartseppcode.From_30_to_39;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Problem_37 {

 static Integer cint(String nr) {
  return Integer.parseInt(nr);
 }

 static boolean isLTP(String mem, Set<Integer> primes) {
  int n = mem.length();
  if (n < 1)
   return true;
  return primes.contains(cint(mem)) && isLTP(mem.substring(1), primes);
 }

 static boolean isRTP(String mem, Set<Integer> primes) {
  int n = mem.length();
  if (n < 1)
   return true;
  return primes.contains(cint(mem))
    && isRTP(mem.substring(0, n - 1), primes);
 }

 static boolean isTP(String mem, Set<Integer> primes) {
  return isLTP(mem, primes) && isRTP(mem, primes);
 }

 private static void bTP(Integer mem, Set<Integer> primes,
   Set<Integer> truncatable) {
  if (primes.contains(mem)) {
   if (isTP(""+mem, primes))
    truncatable.add(mem);
   TruncatablePrimes(mem, primes, truncatable);
  }
 }

 private static void TruncatablePrimes(Integer elem, Set<Integer> primes,
   Set<Integer> truncatable) {
  String[] o = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
  String s = "" + elem;

  for (String pos : o) {
   bTP(cint(s + pos), primes, truncatable);
   bTP(cint(pos + s), primes, truncatable);
  }
 }

 public static void main(String[] args) throws FileNotFoundException {
  Set<Integer> truncatable = new HashSet<Integer>();
  Set<Integer> primes = new HashSet<Integer>();
  Scanner sc = new Scanner(new File("primes1m.txt"));
  int sum = 0;

  for (String tmp = sc.next(); sc.hasNext(); tmp = sc.next())
   primes.add(Integer.parseInt(tmp));

  for (Integer elem : new Integer[] { 3, 7 })
   TruncatablePrimes(elem, primes, truncatable);

  for (Integer elem : truncatable)
   sum += elem;

  System.out.println(sum);
 }
}

Euler Problem 36 solution

Time (s): ~0.476
package margusmartseppcode.From_30_to_39;

public class Problem_36 {
 static boolean palindrome(String p) {
  return p.equals(new StringBuilder(p).reverse().toString());
 }

 static String dec2bin(int number) {
  return Integer.toString(number, 2);
 }

 public static void main(String[] args) {
  int sum = 0, size = 1000000;

  for (int i = 0; i < size; i++)
   sum += palindrome("" + i) && palindrome(dec2bin(i)) ? i : 0;

  System.out.println(sum);
 }
}

Euler Problem 35 solution

Time (s): ~0.921
package margusmartseppcode.From_30_to_39;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Problem_35 {
 static boolean contains_024568(final char[] input) {
  int n = input.length;
  for (int i = 4; i < n; i++)
   if (input[i] == '0' || input[i] == '2' || input[i] == '4'
     || input[i] == '5' || input[i] == '6' || input[i] == '8')
    return true;
  return false;
 }

 static void rotate(StringBuilder sb) {
  sb.append(sb.charAt(0)).delete(0, 1);
 }

 static int iRotate(StringBuilder s) {
  return Integer.parseInt(s.append(s.charAt(0)).delete(0, 1).toString());
 }

 static void CircularPrimes(Integer elem, Set<Integer> primes,
   Set<Integer> found, Set<Integer> circular) {
  StringBuilder sb = new StringBuilder("" + elem);
  ArrayList<Integer> tmp = new ArrayList<Integer>();
  int n = sb.length(), i;

  if (found.contains(elem) || circular.contains(elem))
   return;
  for (i = 1; i <= n; i++)
   tmp.add(iRotate(sb));
  for (Integer mem : tmp)
   if (!primes.contains(mem)) {
    found.addAll(tmp);
    return;
   }

  circular.addAll(tmp);
 }

 public static void main(String[] args) throws FileNotFoundException {
  Set<Integer> circular = new HashSet<Integer>();
  Set<Integer> primes = new HashSet<Integer>();
  Set<Integer> found = new HashSet<Integer>();
  Scanner sc = new Scanner(new File("primes1m.txt"));

  for (String tmp = sc.next(); sc.hasNext(); tmp = sc.next())
   if (!contains_024568(tmp.toCharArray()))
    primes.add(Integer.parseInt(tmp));

  for (Integer elem : primes)
   CircularPrimes(elem, primes, found, circular);

  System.out.println(circular.size());
 }
}

Tuesday, September 8, 2009

Euler Problem 34 solution

Time (s): ~0.175
package margusmartseppcode.From_30_to_39;

public class Problem_34 {

 public static void main(String[] args) {
  int fact[] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 };
  int s = 0, sum = 0;

  for (int i = 10; i < fact[9] + 1; i++, sum = 0) {
   for (char c : ("" + i).toCharArray())
    sum += fact[Character.getNumericValue(c)];
   if (sum == i)
    s += i;
  }

  System.out.println(s);
 }
}

Euler Problem 33 solution

Time (s): ~0.001
package margusmartseppcode.From_30_to_39;

public class Problem_33 {
 public static void main(String[] args) {
  int d = 1;
  double ii;

  for (int i = 1; i < 10; i++)
   for (int j = 1; j < i; j++)
    for (double k = 1; k < j; k++) {
     ii = (i * 10 + j) / (k * 10 + i);
     if (ii == j / k)
      d *= ii;
    }

  System.out.println(d);
 }
}

Euler Problem 32 solution

Time (s): ~0.066
package margusmartseppcode.From_30_to_39;

import java.util.HashSet;
import java.util.Set;

public class Problem_32 {
 static final int nbrs = 9;

 static boolean isPandigital(String s) {
  return isPandigital(s, nbrs);
 }

 static boolean isPandigital(String s, int nr) {
  if (s.length() != nr)
   return false;

  Set<Character> set = new HashSet<<Character>();
  for (int i = 0; i < nr; i++)
   set.add(s.charAt(i));

  if (set.size() != nr)
   return false;
  if (set.contains('0'))
   return false;
  return true;
 }

 public static void main(String[] args) {
  Set<Integer> set = new HashSet<Integer>();
  int sum = 0;

  for (int i = 2, n = 1234; i < 100; i++, n = i > nbrs ? 123 : 1234)
   for (int j = n; j < (int) (10000 / i + 1); j++)
    if (isPandigital("" + i + j + (i * j)))
     set.add(i * j);

  for (Integer val : set)
   sum += val;

  System.out.println(sum);
 }
}

Euler Problem 31 solution

Time (s): ~0.001
package margusmartseppcode.From_30_to_39;

public class Problem_31 {
 public static void main(String[] args) {
  int target = 200, coins[] = { 1, 2, 5, 10, 20, 50, 100, 200 };
  int ways[] = new int[target + 1];
  ways[0] = 1;

  for (int coin : coins)
   for (int i = coin; i < target + 1; i++)
    ways[i] += ways[i - coin];

  System.out.println(ways[target]);
 }
}

Euler Problem 30 solution

Time (s): ~0.662
package margusmartseppcode.From_30_to_39;

public class Problem_30 {
 public static void main(String[] args) {
  int EXP = 5, i = 10, s = 0, t = 0;
  long max = (long) (Math.pow(9.0, EXP) * (EXP - 1));

  for (int n = i; n < max; t += (s == n ? s : 0), n++, s = 0)
   for (i = n; i > 0; i /= 10)
    s += Math.pow((i % 10), EXP);

  System.out.println(t);
 }
}