Numeri di Smith

« Older   Newer »
 
  Share  
.
  1. ~{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 ;)
     
    Top
    .
  2. x-reynik-x
     
    .

    User deleted


    Ma in Python è così?
    CODICE
    def 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....
     
    Top
    .
  3.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    CODICE
    x += x&1


    La risposta penso stia in x&1.

    CODICE
    2 & 1 = 0
    3 & 1 = 1
    9 & 1 = 1
     
    Top
    .
  4. x-reynik-x
     
    .

    User deleted


    E allora come si fa?
     
    Top
    .
  5. Ace.
     
    .

    User deleted


    Scusate l'up dopo quasi 3 anni :P
    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.

    P.s.: se non capite qualcosa lo commento o ve lo dico direttamente qui, ma voi siete pro e capirete tutto o.o


    CODICE
    #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;
    }
     
    Top
    .
  6. 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:
    CODICE
    from 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)
     
    Top
    .
35 replies since 27/11/2009, 15:02   566 views
  Share  
.