-
~{Skydrake™}».
User deleted
CITAZIONE (~Andrey™ @ 10/2/2010, 22:00)CITAZIONE (x-reynik-x @ 10/2/2010, 21:01)Però il codice di Skydrake dà True per tutti i dispari, che è sbagliato!CITAZIONE (~Andrey™ @ 7/2/2010, 15:22)PS: Il tuo "Return True" andava dopo il For, anche se sicuramente sarà stata una svista
Fixed. -
x-reynik-x.
User deleted
Ma in Python è così? CODICEdef primo(n):
for x in xrange(2, int(n**0.5)+1):
x += x&1
if n % x == 0:
return False
return True
Però mi dà True per tutti i dispari..... -
.CODICEx += x&1
La risposta penso stia in x&1.CODICE2 & 1 = 0
3 & 1 = 1
9 & 1 = 1. -
x-reynik-x.
User deleted
E allora come si fa? . -
Ace..
User deleted
Scusate l'up dopo quasi 3 anni
Però oggi ho trovato questo file dei numeri di smith (tra l'altro non completo) e ho deciso di metterlo in ordine e postarlo qui, visto che al tempo non lo postai mai xD
Inoltre può piacere a qualche utente non frequentante 3 anni fa, risolvere questo esercizio.
Il mio codice in C calcola i primi 100 numeri di smith e li stampa a video.SPOILER (clicca per visualizzare)P.s.: se non capite qualcosa lo commento o ve lo dico direttamente qui, ma voi siete pro e capirete tutto o.oCODICE#include "stdafx.h"
#include <stdio.h>
int x,i;
int sum(int n){
int tot;
tot=0;
while (n>0) {
tot+=n%10;
n=n/10;
}
return tot;
}
int primo (int n) {
int i,flag;
i=2;
flag=1;
while ((i<=n/2) && flag){
if (n%i==0){
flag=0;
}
i+=1;
}
return flag;
}
int smith (int n) {
int x,tot,i;
i=n;
x=2;
tot=0;
while (x<=i){
if (i%x==0){
tot=tot+sum(x);
i=i/x;
x=1;
}
x+=1;
}
return tot==sum(n);
}
int main()
{
x=0;
i=0;
while (i<=100){
if (smith(x) && !(primo(x))){
printf("%dn",x);
i+=1;
}
x+=1;
}
scanf_s("%d",&x);
return 0;
}. -
nikitheve.
User deleted
Eccomi a resuscitare un altro post vecchissimo, questi esercizi sono troppo intrippanti. Sempre Python, mi fa i primi 1000 numeri di Smith in 17-18 secondi, non so quanto buono sia, ma mi ritengo ultrasoddisfatto.
Ecco il codice:CODICEfrom math import sqrt
from time import time
pmi = [2, 3]
nsh = [4]
def primi(num):
n = pmi[len(pmi) - 1] + 2
while n <= num:
c = 0
for p in pmi:
if n % p == 0:
c = 1
break
if p > sqrt(n):
break
if c == 0:
pmi.append(n)
n += 2
def sumcfr(num):
s1 = 0
for i in range(len(str(num))):
s1 += int(str(num)[i])
return s1
def smith(num):
primi(num)
if num in pmi:
return False
s1 = sumcfr(num)
s2 = 0
while num != 1:
for p in pmi:
while True:
if num % p == 0:
s2 += sumcfr(p)
num = num / p
else:
break
if s1 == s2:
return True
else:
return False
def smithupto(num):
t = time()
n = nsh[len(nsh) - 1] + 1
while len(nsh) < num:
if smith(n):
nsh.append(n)
n += 1
print nsh
print "%.2f" % (time() - t).