jueves, 15 de marzo de 2012

Project Euler 40

#include <iostream>
#include <math.h>
using namespace std;
//metodo para obtener el i-esimo caracter de la concatenacion de 1,2,3,4,5...
int d(int i)
{
    int cd = 0; //cantidad de digitos
    int cda = 0; //cantidad de digitos acumulados
    int scd = 0; //siguiente cantidad de dtitos
    while( cda + scd < i)
    {
        cda += scd;
        cd++;
        scd =  (pow(10,cd)-pow(10,cd-1))*cd;
    }
    int numactual = pow(10,cd-1)-1;//numero actual hasta el cual se sumo
    while(cda < i)
    {
        cda += cd;
        numactual++;
    }
    int csp = (cda-i);
    while(csp--) numactual /= 10;
    return numactual%10;
}
int main()
{
    cout << d(1)*d(10)*d(100)*d(1000)*d(10000)*d(100000)*d(1000000)<<endl;
    return 0;
}

martes, 13 de marzo de 2012

Project Euler 39

#include <iostream>
using namespace std;
int main()
{
    int v[1001], a, b, c;
    for( a = 1000 ; a >= 0 ; a--) v[a] = 0 ;
    for ( c = 1; c <= 1000; c++)
        for ( b = 1; b < c; b++)
            for ( a = 0; a <= b; a++)
                if(a+b>c && b-a<c && a+b+c <= 1000 && c*c == a*a+b*b)
                    v[a+b+c]++;
    b = 0 ;
    for ( a = 0; a <= 1000; a++)
        if(v[a]>v[b])
            b = a;
    cout << b << endl;
    return 0;
}

Project Euler 38

public class Problema38 {
 static boolean isPandigital(String num){
  if(num.length()!=9)
   return false;
  for (int i = 1; i < 10; i++) 
   if(!num.contains(""+i))
    return false;
  return true;
 }
 public static void main(String[] args) {
  String max = "123456789";
  for (int i = 9; i < 10000; i++) {
   int m = 1;
   String sol = "";
   while(sol.length()<9){
    sol += (i*m);
    m++;
   }
   if(sol.length()==9)
    if(isPandigital(sol))
     if(sol.compareTo(max)>0)
      max = sol;
  }
  System.out.println(max);
 }
}

lunes, 20 de febrero de 2012

Problem Euler 18 y 67

Empezando con DP
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class problem18 
{
 public static void main(String[] args) throws FileNotFoundException {
  int m[][]=readArch();
  for (int i = m.length-2; i >=0; i--) 
  { 
   for (int j = 0; j <=i; j++) {
    
    m[i][j]+=Math.max(m[i+1][j+1], m[i+1][j]);
   }
  }
  System.out.println(m[0][0]);
 }

 private static int[][] readArch() throws FileNotFoundException 
 {
  int triangulo[][]= new int [150][150];
  Scanner sc = new Scanner (new File("C:\\triangle1.txt"));
  int co=0,fi=0;
  while(sc.hasNextLine())
  {
   String linea = sc.nextLine();
   String v[]= linea.split(" ");
   for (int i = 0; i < v.length; i++) 
   { 
    co=i;
    triangulo[fi][co]=Integer.parseInt(v[i]);  
   } 
   fi++;
  }
  return triangulo;
 }
}

domingo, 19 de febrero de 2012

project euler # 41

una variacion del problema 32

import java.util.Arrays;
import java.util.BitSet;
import java.util.Scanner;


public class problem41 
{
 public static void main(String[] args) 
 {


  long tiempo= System.currentTimeMillis();
  BitSet a = new BitSet(987654321);
  int i =2,j=0;
  for(i=2;(i*i)<=10000000;i=i+1)
  {
   if(!a.get(i))
   {
    for(j=i+i;j<=10000000;j=j+i)
    {
     a.set(j);
    } 
   }
  }
  for (int j2 =7654321; j2 >=1 ;j2--) 
  {
   String x=Integer.toString(j2);
   char v[]= x.toCharArray();
   Arrays.sort(v);
   if(!a.get(j2))
   {
    if(ispandigital(x, v[v.length-1]-48))
    {System.out.println(x);
    break;
    }
   }
  }
  System.out.println(System.currentTimeMillis()-tiempo);
 }
 public static boolean ispandigital(String x,int n)
 {
  boolean v[]= new boolean[n+1];
  for (int i = 0; i < x.length(); i++) 
  {
   v[x.charAt(i)-48]=true;
  }
  for (int i = 1; i < n+1; i++) 
  {
   if(!v[i])
    return false;
  }

  return true;
 }
}

project euler # 32

este problema me costo algo pero al menos encontre una forma mas optima de lo que vi en internet

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;


public class problem32 
{
 public static void main(String[] args) {
  
  long tiempo = System.currentTimeMillis();
  HashSet b= new HashSet();
  String cad;
  String n;
  for (int i = 1; i < 8; i++) {
   for (int j = 1000; j < 10000; j++) 
   {
      cad=Integer.toString(i*j);
      n= Integer.toString(i)+Integer.toString(j);
      if((n+cad).length()==9)
      {
       if(ispandigital(n+cad))
       {
        b.add(i*j);
       }
        
      }
   }
  }
  for (int i = 10; i < 100; i++) {
   for (int j = 100; j < 1000; j++) 
   {
    cad=Integer.toString(i*j);
      n= Integer.toString(i)+Integer.toString(j);
      if((n+cad).length()==9)
      {
       if(ispandigital(n+cad))
       {
        b.add(i*j);
       }
        
      }
   }
  }
  int c =0;
  for( Iterator it = b.iterator(); it.hasNext(); ) { 
  c=c+it.next(); } 
  System.out.println(c);
  System.out.println(System.currentTimeMillis()-tiempo);

  
 }
 public static boolean isPandigital(String all){
        if(all.length() != 9) return false;
        String arr[] = all.split("");
        
        for(int i=1; i<=9; ++i){
                boolean varMi = false;
                String son = Integer.valueOf(i).toString();
                
                for(int j=0; j<10; ++j){
                        if(arr[j].equals(son)){
                                varMi = true;
                                break;
                        }
                }
                if(!varMi) return false;
        }
        return true;
 }
 public static boolean ispandigital(String x)
 {
  boolean v[]= new boolean[10];
 
 
  for (int i = 0; i < x.length(); i++) 
  {
   
   v[x.charAt(i)-48]=true;
   
       
  }
  for (int i = 1; i < 10; i++) 
  {
   if(!v[i])
   return false;
       
  }
  
   return true;
 }
   
}

miércoles, 15 de febrero de 2012

proyect euler 40


public class problem40 
{
 public static void main(String[] args) 
 {
  StringBuffer a = new StringBuffer();
  a.append("123456789");
  int n =1;
  while(n<=100000)
  {
   for(int i = 0; i <=9; i++) 
   {
    String elem = Integer.toString(n)+Integer.toString(i);
    a.append(elem); 
   }
   n++;
  }
  int p =1;
  int c =1;
  for (int i = 0; i <= 6; i++) 
  {
       c=c*(a.charAt(p-1)-48);
       p=p*10;
  }
  System.out.println(c);
 }
}