Newsgroup: it.comp.lang.visual-basic
Titolo: algoritmo

Salve ragazzi , ho bisogno del vostro aiuto
Devo scrivere un algoritmo che mi genera
"0" , "1" , "2" , "3"  .... "9","10","11" , etc ...
cioč numeri in formato stringa!
semplice direte voi basta fare cosě
for i =1 to n
    strNumero = cstr( i )
next i
il fatto č che il contatore come numerico
arriva (se utilizzo per esempio un long )
fino a 2.147.483.647
dovendo sfornare numeri fino a 30 cifre come posso fare?

 ha scritto nel messaggio 
news:7El_d.1078286$35.39...@news4.tin.it...

Se devi generare *tutti* i numeri fino a 30 cifre ll limite del Long e' 
l'ultimo dei tuoi problemi; prova a impostare n=2.000.000.000 e vedi quanto 
impiega un ciclo come quello sopra... immagina ora con n=10^29
Che devi fare esattamente?
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown 

 ha scritto nel messaggio
news:7El_d.1078286$35.39...@news4.tin.it...

Se tanto devono essere stringhe puoi fare una cosa del tipo:
For i = 0 To 9
    For j = 0 To 9
        For k = 0 To 9
            For l = 0 To 9
                    ..........
                s = CStr(i) + CStr(j) + CStr(k) + CStr(l)  .........
                Debug.Print s
            Next l
        Next k
    Next j
Next i
eccetera per quante cifre vuoi (l'esempio e' per 4 cifre)
Ciao

            For l = 0 To 9
[SNIP]
Ehmmm...
hai mai sentito la storiella della scacchiera e del chicco di riso? prova un 
po' a contare quante iterazioni vengono fuori con 30 cifre...



Certo ma come lo fai lo fai sempre cicli immensi devi fare in quanto per
arrivare a cifre di 30 cifre devi passare per le 29 , 28 eccperche  tutti li
devi stampare ,questa e' la richiesta!
Ciao

cioč numeri in formato stringa!
C'č un scopo preciso in tutto ciň, o č un esercizio?
Nel primo caso (se lo spieghi) si puň fare sicuramente in un altro modo, nel
secondo...
termoPilucco

 devi stampare ,questa e' la richiesta!
Dubito fortemente che Notorius abbia davvero intenzione di stampare *TUTTI* 
i numeri da 1 cifra a 30 cifre...



Certo se non le deve stampare tutte , hai ragione , ma visto che nel primo
messaggio ha fatto l'esempio del for , o si e' spiegato male o le deve
stampare tutte.Pero' a questo punto , se non le deve stampare tutte , non
capisco il problema ; per stampare una cifra specifica in formato testo non
e' difficile no? Magari con un altro messaggio sara' piu chiaro!
Ciao


Ottimo , grazie
C'è solo un problema.
Occorre eliminare gli zeri in testa (quasto produce ..00001,...00002 etc..)
gli zeri a sinistra non devono essrerci.
Qualche alltro suggerimento ?
Grazie

 etc..) gli zeri a sinistra non devono essrerci.
Per questo puoi banalmente applicare
Format(valore,"#")
pero', scusa se mi ripeto ancora, hai una vaga idea di quanto ci vuole per 
elaborare tutti questi numeri? se proprio sicuro che devi generarli tutti?


 Ciao
Si,devo generarli tutti.Non ha importaza quanto tempo č richiesto per
l'elaborazione.
L'ultima volta ho impiegato circa una settimana
ciao

 ciao
Mi sfugge lo scopo pratico, ma buona fortuna comunque...
Se decidi per i cicli nidificati e vuoi provare ad ottimizzare un minimo, e' 
probabilmente meglio evitare la creazione e concatenazione continua di 
stringhe, ed utilizzare invece una variabile gia' dimensionata.
per esempio:
s=String(4, "0")
for i
  for j
    for k
      for l
        ...
        Mid(s, 1, 1) = CStr(i)
        Mid(s, 2, 1) = CStr(j)
        Mid(s, 3, 1) = CStr(k)
        Mid(s, 4, 1) = CStr(l)
        ...
      next
    next
  next
next
e' piu' prolisso, ma riutilizza sempre la stessa stringa senza distruggerla 
e ricrearla da capo.


Io ho fatto 'sta cosa basata sulla ricorsività.
Di sicuro a farla NON ricorsiva si velocizzerà un bel po', ma non credo 
di molto.
Ovviamente bisogna dichiarare il vettore myVector come array di 30 
piuttosto che di 2.
'-----------------------------
Option Explicit
Dim myVector(1 To 2) As String
Private Sub Form_Load()
Dim I As Integer
Dim Overflow As Boolean
Dim MaxIndex As Integer
     MaxIndex = UBound(myVector)
     Do
         Overflow = Incrementa(MaxIndex)
         If Not Overflow Then
             For I = 1 To MaxIndex
                 If myVector(I) <> "" Then Debug.Print myVector(I);
             Next I
             Debug.Print
         End If
     Loop Until Overflow
End Sub
Private Function Incrementa(ByVal vPos As Integer) As Boolean
Dim V As Integer
     Incrementa = False
     If myVector(vPos) = "" Then
         myVector(vPos) = "1"
     Else
         V = Val(myVector(vPos) + 1)
         If V = 10 Then
             myVector(vPos) = "0"
             If vPos > 1 Then
                 Incrementa = Incrementa(vPos - 1)
             Else
                 'Overflow...
                 Incrementa = True
             End If
         Else
             myVector(vPos) = CStr(V)
         End If
     End If
End Function
-- 
Quando noi ignoranti eravamo di più, tutto era più bello...
(A. Celentano)
Per rispondermi in privato, prima togli l'immondizia dalla testa.

 di molto.
[CUT]
Se il numero di cifre non è fisso a 30, la vedo dura trovare una soluzione
generale non ricorsiva.
Io ho provato una soluzione anch'essa ricorsiva, ma diversa, forse più
performante (nell'IDE): usando un Byte Array.
Dim Digits() As Byte
Const MAX_DIGITS = 30
Const C_ZERO = 48
Const C_SPACE = 32
Private Sub Start()
Dim i As Integer
    ' Inizializza con spazi
    Digits = StrConv(Space(MAX_DIGITS), vbFromUnicode)
    For i = 0 To UBound(Digits)
        GenerateNumbers i
    Next i
End Sub
Private Sub GenerateNumbers(ByVal Tens As Integer)
Dim i As Integer
    ' Evitiamo di ripetere alcuni numeri (es. "0n" è già uscito come " n")
    If (Tens < UBound(Digits)) Then
        If (Digits(UBound(Digits) - Tens - 1) = C_SPACE) Then
            Exit Sub
        End If
    End If
    For i = 0 To 9
        Digits(UBound(Digits) - Tens) = C_ZERO + i
        If Tens = 0 Then
            Debug.Print GetBigNumber
        Else
            GenerateNumbers Tens - 1
        End If
    Next i
End Sub
Private Function GetBigNumber() As String
Dim Number As String
    Number = StrConv(Digits, vbUnicode)
    ' Trucco per rimuovere gli zeri non significativi in cima:
    Number = Replace(LTrim(Replace(Number, "0", " ")), " ", "0")
    ' Almeno 1 però ci deve essere
    If Number = "" Then
        Number = "0"
    End If
    GetBigNumber = Number
End Function
Che trip, eh?
Compilato per numeri di 7 cifre ci ha messo 1'20", non ho osato provare con
30... teoricamente dovrebbe metterci 10^25 secondi, che è un tempo difficilmente
distinguibile dall'eternità...
Bye
Raf

 difficilmente distinguibile dall'eternità...
4 secondi e 70, smepre con 7 cifre (nella mia versione devi scrivere
MAX_DIGITS=8, però) :)
Poi Notorius potrebbe ringraziarci svelandoci a cosa diavolo può servire
'sta cosa :)
termoPilucco
Option Explicit
Const MAX_DIGITS = 30
Const C_ZERO = 48
Const C_UNO = 49
Const C_NOVE = 57
Const C_SPACE = 32
Private Sub Command1_Click()
Dim t As Double
t = Timer
StartT
MsgBox Round(Timer - t, 2)
End Sub
Sub StartT()
Dim a As Long
Dim strArr As String
Dim strfine As String
Dim partenza As Long
Dim arr(MAX_DIGITS * 2 - 1) As Byte
partenza = UBound(arr) - 1
strfine = "1" & String(MAX_DIGITS - 1, "0")
For a = 0 To UBound(arr) - 2 Step 2
    arr(a) = C_SPACE
Next
arr(a) = C_ZERO
Do
    strArr = Trim(arr)
    Debug.Print strArr
    For a = partenza To 0 Step -2
        If arr(a) = C_SPACE Then
            arr(a) = C_UNO
            Exit For
        ElseIf arr(a) <> C_NOVE Then
            arr(a) = arr(a) + 1
            Exit For
        Else
            arr(a) = C_ZERO
        End If
    Next
Loop Until strArr = strfine
End Sub
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Dimenticavo, la mia è una soluzione generale non ricorsiva :)
termoPilucco



Grazie č quello che mi serviva!
ps
Ma come siete arivati a programmare cosě?
:-(

dimenticavo
La SUB StartT arriva a scrivere numeri fino a 30 cifre?
ciao

La SUB StartT arriva a scrivere numeri fino a 30 cifre?
Arriva fino a 2 miliardi di cifre, per la precisione fino al numero
10^((2^31)-1).
Ma tu, del senso, ancor all'oscur ci tieni...
termoPilucco, poeta programmatore

Mi serve per testare la primalità
Il modulo che testa la primalità accetta numeri di
qualsiasi lunghezza ma li tratta come stringhe.

 Dimenticavo, la mia č una soluzione generale non ricorsiva :)
Chapeau...
Elegante e compatta, proprio quella che stavo cercando!
E non essendo ricorsiva (oltre a non perdere tempo con StrConv), va come una
scheggia.
Bye
Raf

 come una scheggia.
Per diletto ne ho fatta un'altra che è il 60% più rapida :)
In pratica elimino i problemi degli spazi usando un'array dinamico anzichè
statico.
Questo implica che non devo più usare la trim() e non devo più verificare
se c'è un C_SPACE nell'array.
Lo scotto da pagare è che devo ridimensionare l'array, ma questo avviene
solo ad ogni nuova cifra decimale aggiunta, ovvero 30 volte se la
precisione desiderata è 30.
termoPilucco
Sub StartT()
Dim a As Long
Dim b As Long
Dim strArr As String
Dim strfine As String
Dim partenza As Long
Dim arr() As Byte
ReDim arr(1)
arr(0) = C_ZERO
arr(1) = 0
strfine = "1" & String(MAX_DIGITS - 1, "0")
partenza = 0
Do
    strArr = arr
    'Debug.Print strArr
    For a = partenza To 0 Step -2
        If arr(a) <> C_NOVE Then
            arr(a) = arr(a) + 1
            Exit For
        Else
            arr(a) = C_ZERO
            If a = 0 Then
		' nuova cifra raggiunta
                ReDim Preserve arr(UBound(arr) + 2)
                For b = 2 To UBound(arr) Step 2
                    arr(b) = arr(b - 2)
                Next
                arr(0) = C_UNO
                partenza = partenza + 2
            End If
        End If
    Next
Loop Until strArr = strfine
End Sub
