#include <iostream>
#include <algorithm>
using namespace std;
const int n= 7654322;
bool esPrimo[n+1];
void generarCriba()
{
for(int i = 3 ; i <= n; i+=2)
esPrimo[i] = true;
for(int i = 4 ; i <= n; i+=2)
esPrimo[i] = false;
esPrimo[2] = true;
for(int i = 3; i*i <= n; i+=2)
if(esPrimo[i])
for(int j = i+i ; j <= n; j+=i)
esPrimo[j] = false;
}
int main()
{
generarCriba();
string ini = "7654321";
string fin = "1234567";
int i = 0 ;
while(ini.compare(fin)!=0)
{
if(((ini[6]-'0')&1)!=0)
if(esPrimo[atoi(ini.data())])
{
cout << ini << endl;
break;
}
prev_permutation(ini.begin(),ini.end());
}
return 0;
}
martes, 10 de abril de 2012
Project Euler 41
Project Euler 37
#include <iostream>
#include <bitset>
#include <math.h>
using namespace std;
bool esPrimo(int n)
{
if(n==1)
return false;
for(int i = 2; i*i<=n; i++)
if(n%i==0)
return false;
return true;
}
bool esCPI(int n)
{
int nc = 10;
while(nc<n)
{
if(!esPrimo(n%nc))
return false;
nc *= 10;
}
return true;
}
int main()
{
int ini=0,fin=0;
int term[] = {1,3,7,9};
int td[100]= {2,3,5,7};
int pos=4;
ini = 0;
fin = 3;
for(int cd = 1; cd<=9; cd++)
{
for(int i=ini ; i<=fin; i++)
{
for(int t = 0 ; t<=3; t++)
{
int ope = td[i]*10+term[t];
if(esPrimo(ope))
td[pos++] = ope;
}
}
ini = fin+1;
fin = pos-1;
}
int sum = 0 ,cant = 0;
for(int i = 4; i<=fin ; i++)
if(esCPI(td[i]))
{
cout << td[i] << endl;
sum += td[i];
cant++;
}
cout << "cantidad total = "<<cant<<endl;
cout << "resultado final = "<<sum<<endl;
return 0;
}
Project Euler 36
#include <iostream>
#include <string>
using namespace std;
bool esPalindrome(string cad)
{
int i,j;
i = 0;
j = cad.size()-1;
while(i<j)
if(cad[i++]!=cad[j--])
return false;
return true;
}
string abase2(int n)
{
string sol = "";
while(n>0)
sol = (char)((n&1)+'0')+sol , n >>= 1;
return sol;
}
string aString(int n)
{
string sol = "";
while(n>0)
{
int d = n%10;
sol = (char)(d+'0')+sol;
n /= 10;
}
return sol;
}
int main()
{
//872187
int suma = 0 ;
const int n = 1000000;
for(int i = 1; i < n; i+=2)
if(esPalindrome(aString(i)) && esPalindrome(abase2(i)))
suma += i;
cout << suma << endl;
return 0;
}
Project Euler 35
#include <iostream>
#include <bitset>
using namespace std;
const int n = 1000000;
bitset<n+1> criba;
void generarCriba()
{
criba[0] = criba[1] = true;
for(int i = 2 ; i*i<=n; i++)
if(!criba[i])
for(int j = i+i; j<=n; j +=i )
criba[j]= true;
}
int main()
{
generarCriba();
int cont = 4;//2,3,5,7 ya cuentan como primos circulares
int cc = 1;
int sncc= 100;
int nc = 10;
for(int i = 10 ; i<n; i++)
{
if(i==sncc)
{
cc++;
sncc *=10;
nc *= 10;
}
if(!criba[i])
{
int num = i;
int c = 0;
for(int u = 1 ; u<=cc; u++)
{
int d = num%10;
num /= 10;
num = (d*nc+num);
if(!criba[num])
c++;
else
break;
}
if(c == cc)
cont++;
}
}
cout <<"Resultado final = "<< cont<< endl;
return 0;
}
Project Euler 34
#include <iostream>
using namespace std;
int main()
{
int sum = 0 ;
int fac[10] = {1,1,2};
for(int i = 3; i<=9; i++)
fac[i] = i*fac[i-1];
int num = 0;
int n[5]= {0};
for(n[0] = 0 ; n[0]<10 ; n[0]++)
for(n[1] = 0 ; n[1]<10 ; n[1]++)
for(n[2] = 0 ; n[2]<10 ; n[2]++)
for(n[3] = 0 ; n[3]<10 ; n[3]++)
for(n[4]= 0 ; n[4]<10 ; n[4]++)
{
int pos = 0 ;
while(pos <=4 && n[pos]==0)
pos++;
if(fac[n[0]]+fac[n[1]]+fac[n[2]]+fac[n[3]]+fac[n[4]]-pos==num)
{
cout << n[0] << "! + ";
cout << n[1] << "! + ";
cout << n[2] << "! + ";
cout << n[3] << "! + ";
cout << n[4] << "! = " << num<< endl;
sum += num;
}
num++;
}
cout << sum-3<< endl;
/*Le restamos 3 por que en el enunciado
indica que no hay que sumar 1! = 1 y 2! = 2
*/
return 0;
}
Project Euler 33
#include <iostream>
using namespace std;
int mcd(int a,int b)
{
int c;
if(b>a)
{
c = a;
a = b;
b = c;
}
c = a%b;
while(c > 0)
{
a = b;
b = c;
c = a%b;
}
return b;
}
int main()
{
int mcdiv;
int de,nu;
int resultadoden = 1;
int resultadonum = 1;
for(int num = 10; num<=50; num++)
for(int den = 10; den <= 99 ; den++)
{
mcdiv = mcd(num,den);
if(num != den && mcdiv!=1 && mcdiv%10!=0)
{
de = den/mcdiv;
nu = num/mcdiv;
int dat1[2]= {num/10,num%10};
int dat2[2]= {den/10,den%10};
for(int i=0; i<=1; i++)
for(int j = 0; j<=1; j++)
if(dat1[i]!=0 && dat2[j]!=0 &&
dat1[i]%nu==0 &&
dat2[j]%de==0 &&
(dat1[i]/nu)==(dat2[j]/de) &&
(dat1[(i+1)%2]==dat2[(j+1)%2]))
{
cout << num<<"/"<<den<<" = "<<dat1[i]<<"/"<<dat2[j]<<endl;
resultadoden *= den;
resultadonum *= num;
}
}
}
cout << "Resultado final = "<< resultadoden/mcd(resultadonum,resultadoden) <<endl;
return 0;
}
Project Euler 32
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <set>
#include <numeric>
using namespace std;
int factorial(int n)
{
int f = 1;
while(n>0)
f *= n--;
return f;
}
int main()
{
set<int> guardar ;
string cad = "123456789";
int tam = cad.length();
int n1,n2,n3,i,j;
int fac = factorial(tam);
for(int n = 0 ; n < fac; n++)
{
for(i = 1 ; i <=(tam-2) ; i++ )
{
n1 = atoi(cad.substr(0,i).data());
for(j = 1 ; j <= (tam-i-1); j++)
{
n2 = atoi(cad.substr(i,j).data());
n3 = atoi(cad.substr(i+j,tam-i+j).data());
if((n1*n2) == n3)
{
cout << n1 << " x "<<n2 <<" = "<<n3<<endl;
guardar.insert(n3);
}
}
}
next_permutation(cad.begin(),cad.end());
}
cout << "Resultado Final = "<<accumulate(guardar.begin(),guardar.end(),0)<<endl;
return 0;
}
Suscribirse a:
Entradas (Atom)