View Full Version : [c] realizzare programma che fa sottrazione tra 2 numeri naturali da 20 cifre
Andre_Santarell
21-07-2006, 10:13
ciao a tutti
per l'università devo realizzare un programma in c (non in c++ o altro)
premesso che le mie conoscenze sono molto limitate, ilprogramma deve fare la sottrazione tra due numeri naturali di 20 cifre. o meglio da un numero di massimo 20 cifre ne va sottratto un altro qualsiasi
ho già realizzato un semplice programma di sottrazione tra due numeri, il problema e' che se inserisco numeri di oltre dieci cifre mi sballa tutto quanto
come posso fare per risolvere il problema?
potete aiutarmi ?
ilsensine
21-07-2006, 10:29
E' un problema di dinamica...i numeri interi hanno in genere un range di 2^31 (2^32 gli unsigned), quindi fino a circa 2 (4) giga.
Gli interi a 64 bit arrivano a 2^63 (2^64 gli unsigned), ancora non sufficienti per gestire numeri decimali di venti cifre (2^64 = ~ 1.8*10^19)
Non puoi quindi risolvere il tuo problema con i numeri nativi del c; devi operare direttamente sulle stringhe ed "emulare" la matematica (ringrazia che ti hanno chiesto solo sottrazioni). Probabilmente il problema è studiato ad hoc per obbligarti a usare le stringhe per risolverlo.
Anomaly Rulez
21-07-2006, 10:30
per i numeri se usi delle variabili int (fino a 16 bit) credo tu possa arrivare fino a 32.767 circa, con un long int (fino a 32 bit) arrivi fino a 2.147.483.647 quindi non so come si possa fare una sottrazzione con numeri di 20 cifre :confused:
premesso che le mie conoscenze sono molto limitate, ilprogramma deve fare la sottrazione tra due numeri naturali di 20 cifre. o meglio da un numero di massimo 20 cifre ne va sottratto un altro qualsiasiIl problema è il tipo di dato da usare .... anche ammesso di usare il tipo di dato long long (del C99) che è di 64 bit, il valore massimo sarebbe 9 223 372 036 854 775 807, quindi solo 19 cifre!
Andre_Santarell
21-07-2006, 11:13
ciao ho parlato con il mio prof e mi ha detto che effettivamente devo usare le stringhe.. il problema e' che io non so come usarle.. credo vadano convertiti in numero o qualcosa del genere..
fatemi sapere
grazie
ciao
ciao ho parlato con il mio prof e mi ha detto che effettivamente devo usare le stringhe.. il problema e' che io non so come usarle.. credo vadano convertiti in numero o qualcosa del genere..Convertirle in numero no, se non hai a disposizione un tipo di dato sufficientemente grande (e come anche io ho detto, nemmeno 64 bit bastano).
Usando direttamente le stringhe, puoi fare la sottrazione digit per digit come la si farebbe "a mano". ;)
Se va bene al tuo prof ...
Andre_Santarell
21-07-2006, 11:18
online ho trovato questo post
http://groups.google.it/group/it.comp.lang.c/browse_thread/thread/35d25bdb7b3742f1/463fc4ee0a6015f4?lnk=st&q=&rnum=1&utoken=N0BwOTEAAAD3b5Phz9Z4l-_CiTuBL0saGW225H4FeKegueVG1LsqBxouSRNCX7J5m7rROKwPXLOMKN2o9YZfQ4UFyks_AAUi
il problema e! analogo ma non ho capito come hanno risolto
queste le risposte nodali:
Era una CAZZATA!!!!Bastava dichiarare due variabil stringa e due intere,e
per ciscuna variabile stringa inserirvi il numero da tastiera(scanf)
controllare che la sua lunghezza fosse inferiore od uguale a 20 (funzione
length se non erro) usare la funzione atoi per convertirla in intero ed
inserirla nella corrispettiva varibile intera,usare la variabile errno (dopo
averla settata) per verificare che la stringa fosse o meno convertibile in
numero intero(cioè per verificare se atoi è andata a buon fine o no subito
dopo averla eseguita),verificare che l'intero è positivo,altrimenti altro
messaggio di errore fare lo stesso con l'altra stringa se tutto è andato a
buon fine fare le operazioni *+-/ %
e poi stampare il risultato a video (printf)!!!!!
Per quanto riguarda il long esiste la funzione di conversione (mi affido
alle pagine web su cui ho effettuato la ricerca) atol,quindi il problema dei
20 caratteri dovrebbe essere così risolto (con questa semplice modifica al
mio precedente programma),infatti se supponiamo che il long sia a 64 bit
cioò significa che il max numero rappresentabile avrà 64
"uni",giusto?Ora,applicando le mie conoscenze Altamente
Matematico-Fisico-Ingegneristico-Superiori,per calcolare il relativo valore
in decimale (supponiamo di utilizzare una base b generica ed un n di bit
generico)si fa: somma(da i=0 ad i=n-1,poichè il numero totale dei termini
deve essere n) b^i =(b^(n)-1)/(b-1),è chiaro che se banalmente sostituiamo
b=2 ed n=64 otteniamo appunto 2^64-1,che quindi dà 20 cifre in base
decimale,quindi mi sembra che la cazzata che ho detto sia facilmente
riparabile usando il long e l'atol,per il resto direi che è tutto giusto,e
quindi la conclusione più logica ora è che ancora una volta la mia Mentalità
Altamente Ingegneristica ha trionfato sull
cifre,come fare dunque?Sapevo che si poteva fare
con le stringhe un controllo simile,ma non mi risultava che esistesse il
modo di trasformarle in numeri,tant'è vero che non giuravo,ma poi mi è
venuto il sospetto ed ho fatto una ricerca apposita su come convertire una
stringa in un numero,una volta realizzato il concetto ho capito tutto
Andre_Santarell
21-07-2006, 11:24
Convertirle in numero no, se non hai a disposizione un tipo di dato sufficientemente grande (e come anche io ho detto, nemmeno 64 bit bastano).
Usando direttamente le stringhe, puoi fare la sottrazione digit per digit come la si farebbe "a mano". ;)
Se va bene al tuo prof ...
ciao si ha detto che va bene digit per digit e miha detto che devo far si che il programma ponga 0 se la cifra che tolgo e' maggiore della cifra da cui tolgo
qualcuno potrebbe dirmi che listato devo mettere per applicare questo concetto a due cifre e per le restanti cifre lo faccio da solo?
grazie mille per il vostro aiuto, davvero preziosissimo
ciao ;)
Marinelli
21-07-2006, 11:26
Ciao... qualche tempo fa ho dovuto affrontare un problema simile... soltanto che io dovevo operare su numeri grandi anche 200 cifre e farne somme, sottrazioni, moltiplicazioni, divisioni e radici ;)
Il metodo da me seguito è stato proprio quello che ti hanno consigliato: leggere il numero come fosse una stringa e poi convertirlo con le apposite funzioni in interi o in long da mettere in un array (tieni conto che non è strettamente necessario fare la sottrazione cifra a cifra, ma puoi farla anche a blocchi di più cifre).
Il problema di per sè non è troppo difficile, devi solo fare un minimo di attenzione alla conversione e ai riporti (qualora tu operassi in blocchi).
Ciao :)
Andre_Santarell
21-07-2006, 11:41
ciao il problema e' che io non ho ancora la sufficiente abilità a gestire le stringhe.. cioè ho capito il presupposto teorico ma non riesco ancora a buttare giù il codice senza uno spunto vero e proprio..
se me lo facessi digit per digit puoi dirmi come verrebbe per il primo digit ? in modo che poi perle altre 20 me lo riadatto da solo.. ;)
altrimenti avresti ancora il tuo vecchio programma da mostrarmi?
grazie
Andrea
Marinelli
21-07-2006, 11:58
Io mio vecchio programma ce l'ho... ma credo sia un po' troppo complicato per spiegarti la cosa: io facevo tutto con blocchi di 8 cifre.
Cifra per cifra potresti fare in questo modo:
- Leggi il primo numero da input (come stringa) e verifichi che sia lungo 20 caratteri;
- Leggi il secondo numero da input e verifichi che sia lungo 20 caratteri o meno;
- Usando la funzione "atoi" dentro ad un for converti carattere per carattere la stringa in interi, che metti in un array (lo fai per entrambi i numeri)
- Con una funzione costruita ad hoc esegui la sottrazione tra i due array, facendo attenzione ai riporti e alla lunghezza dei due array; se entrambi gli array sono di 20 cifre devi controllare se il sottraendo non sia più grande del minuendo (se non sbaglio in questo caso devi restituire 0).
Per la conversione da carattere a intero puoi usare la funzione atoi:
http://www.cplusplus.com/ref/cstdlib/atoi.html
Per conoscere la lunghezza di una stringa puoi usare la funzione strlen:
http://www.cplusplus.com/ref/cstring/strlen.html
Per gestire gli array di interi, visto che i numeri contenuti possono andare solo da 0 a 9 (anche in negativo, durante l'operazione), puoi utilizzare come terminatore del numero un qualsiasi intero >= 10
Dovrei averti dato una buona base di partenza, ma se serve altro aiuto non c'è problema.
Ciao :)
Andre_Santarell
21-07-2006, 12:56
si mi hai effettivamente dato un validissimo aiuto ;)
provo a buttare giù qualcosa e poi ve lo riporto qui
intanto ancora grazie
ciao
Andrea
Andre_Santarell
21-07-2006, 18:47
Io mio vecchio programma ce l'ho... ma credo sia un po' troppo complicato per spiegarti la cosa: io facevo tutto con blocchi di 8 cifre.
Cifra per cifra potresti fare in questo modo:
- Leggi il primo numero da input (come stringa) e verifichi che sia lungo 20 caratteri;
- Leggi il secondo numero da input e verifichi che sia lungo 20 caratteri o meno;
- Usando la funzione "atoi" dentro ad un for converti carattere per carattere la stringa in interi, che metti in un array (lo fai per entrambi i numeri)
- Con una funzione costruita ad hoc esegui la sottrazione tra i due array, facendo attenzione ai riporti e alla lunghezza dei due array; se entrambi gli array sono di 20 cifre devi controllare se il sottraendo non sia più grande del minuendo (se non sbaglio in questo caso devi restituire 0).
Per la conversione da carattere a intero puoi usare la funzione atoi:
http://www.cplusplus.com/ref/cstdlib/atoi.html
Per conoscere la lunghezza di una stringa puoi usare la funzione strlen:
http://www.cplusplus.com/ref/cstring/strlen.html
Per gestire gli array di interi, visto che i numeri contenuti possono andare solo da 0 a 9 (anche in negativo, durante l'operazione), puoi utilizzare come terminatore del numero un qualsiasi intero >= 10
Dovrei averti dato una buona base di partenza, ma se serve altro aiuto non c'è problema.
Ciao :)
hai pvt
Energy++
21-07-2006, 19:29
raga ma la funzione atoi non coverte una <<stringa>> in un numero???
cioè con i singoli caratteri non funziona o sbaglio?
raga ma la funzione atoi non coverte una <<stringa>> in un numero???
cioè con i singoli caratteri non funziona o sbaglio?Sì certo, converte una stringa in un numero. Ma se vuoi operare su una sola cifra numerica, devi avere una stringa composta da 1 carattere seguito dal carattere nullo!!!
secondo me conviene fare qualcosa tipo
string numero1,numero2;
int j=1;
bool impossibile;//vale true se numero1>numero2
bool riporto;//per il do while del riporto
cout << "Inserire i due numeri:\n";
cin >> numero1 >> numero2;
int n1,n2, ris[20];
if(strlen(numero1)==20 && strlen(numero2)<=20)
{
for(int i=19;i>=0;i--)//for inverso
{
switch(numero1[i])
{
case '0':
n1=0;
break;
case '1':
n1=1;
break;
//...
}
switch(numero2[i])
{
//come prima
}
if(i==0 && n1<n2)//verifica se il 1° numero è maggiore del 2°
impossibile=true;
else
{
riporto=false;
if(n1<n2)
{
riporto=true;
n1+=10;
do{
riporto=false;
switch(numero1[i-j])
{
case '0':
numero1[i-j]='9';
riporto=true;
j++;
break;
case '1':
numero1[i-j]='0';
break;
//...
}
}while(riporto)
j=1;
}
ris[i]=n1-n2;
}
}
}else cout << "0\n";
if(!impossibile)
cout << "Il risultato e': ";
for(int i=0;i<20;i++)
cout << ris[i];
cout << endl;
guardatelo un po voi e decidete
edit: e se anziche usare un long int usassimo un long double, visto che ha (mi sembra) 21 cifre decimali?
Fenomeno85
22-07-2006, 10:11
soluzione del mio neurone dice:
usare tre numeri interi da 32 bit :O ogniuno lavora su una parte del numero da 96 bit che mi sembrano che bastano :D
dovrebbe essere anche molto più veloce che accedere a una stringa .. perchè se riesci a caricarli nei registri son schegge rispetto che accedere in memoria e usare una stringa :D
che ne dite come soluzione? :D
ho vinto qualche cosa? :D
~§~ Sempre E Solo Lei ~§~
ho vinto qualche cosa? :D
ovviamente
NO!! :D
Fenomeno85
22-07-2006, 11:12
ovviamente
NO!! :D
io propongo delle ottime soluzioni e non vinco nulla uffi :asd:
~§~ Sempre E Solo Lei ~§~
Marinelli
22-07-2006, 12:05
soluzione del mio neurone dice:
usare tre numeri interi da 32 bit :O ogniuno lavora su una parte del numero da 96 bit che mi sembrano che bastano :D
dovrebbe essere anche molto più veloce che accedere a una stringa .. perchè se riesci a caricarli nei registri son schegge rispetto che accedere in memoria e usare una stringa :D
che ne dite come soluzione? :D
ho vinto qualche cosa? :D
~§~ Sempre E Solo Lei ~§~
La stringa ti serve solo per prendere l'input... poi non la utilizzi più :)
Fenomeno85
22-07-2006, 12:41
La stringa ti serve solo per prendere l'input... poi non la utilizzi più :)
va buo ma se devi fare calcoli su sto numerone invece di lavorare su singolo carattere è molto + prestante lavorare direttamente su un numero intero :)
perchè se usi anche un array alla fine non lo puoi caricare nei registri mentre il numero si :D
~§~ Sempre E Solo Lei ~§~
usare tre numeri interi da 32 bit :O ogniuno lavora su una parte del numero da 96 bit che mi sembrano che bastano :D Questa soluzione non sarebbe male .... senonché bisogna preoccuparsi di parecchi dettagli di "basso livello". Bisogna implementare la sottrazione (che è quello che si vuole fare) ma anche le altre tre operazioni di somma/moltiplicazione/divisione (per le conversioni). Inoltre bisogna tenere presente che è necessario gestire il numero a 96 bit in complemento a due (e il bit di segno sta nella parola più alta) e inoltre, per somme/sottrazioni, è necessario gestire il carry/borrow che in linguaggio "C" .... non è (facilmente) direttamente gestibile.
In assembly sarebbe chiaramente moooolto più facile. ;)
Fenomeno85
22-07-2006, 12:56
Questa soluzione non sarebbe male .... senonché bisogna preoccuparsi di parecchi dettagli di "basso livello". Bisogna implementare la sottrazione (che è quello che si vuole fare) ma anche le altre tre operazioni di somma/moltiplicazione/divisione (per le conversioni). Inoltre bisogna tenere presente che è necessario gestire il numero a 96 bit in complemento a due (e il bit di segno sta nella parola più alta) e inoltre, per somme/sottrazioni, è necessario gestire il carry/borrow che in linguaggio "C" .... non è (facilmente) direttamente gestibile.
In assembly sarebbe chiaramente moooolto più facile. ;)
si ma penso che non siano molto più complicati come gestire un array :D
~§~ Sempre E Solo Lei ~§~
si ma penso che non siano molto più complicati come gestire un array :D Se deve fare solo una semplice sottrazione è invece più semplice la sottrazione digit x digit. ;)
Non so se conosci l'assembly x86. Questa è una somma su 96 bit in precisione multipla:
MOV EAX,[ESI+0]
ADD [EDI+0],EAX
MOV EAX,[ESI+4]
ADC [EDI+4],EAX
MOV EAX,[ESI+8]
ADC [EDI+8],EAX(supponendo che ESI punti al operando1 e EDI punti al operando2/destinazione).
Prova a scriverla in "C" puro. :D
Fenomeno85
22-07-2006, 13:54
Se deve fare solo una semplice sottrazione è invece più semplice la sottrazione digit x digit. ;)
Non so se conosci l'assembly x86. Questa è una somma su 96 bit in precisione multipla:
MOV EAX,[ESI+0]
ADD [EDI+0],EAX
MOV EAX,[ESI+4]
ADC [EDI+4],EAX
MOV EAX,[ESI+8]
ADC [EDI+8],EAX(supponendo che ESI punti al operando1 e EDI punti al operando2/destinazione).
Prova a scriverla in "C" puro. :D
mi fai sempre + paura anche te :D
~§~ Sempre E Solo Lei ~§~
repne scasb
22-07-2006, 15:16
Prova a scriverla in "C" puro.
Bel quesito (a meno di errori grossolani):
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define ADD_SIZE (96/32)
void main(void)
{
unsigned long op1[ADD_SIZE],op2[ADD_SIZE],op3[ADD_SIZE];
int i,c;
time_t t;
srand((unsigned)time(&t));
printf(" ");
for(i=ADD_SIZE-1;i>=0;i--)
{
op1[i]=rand();
op1[i]*=op1[i]*op1[i];
printf("%.8X",op1[i]);
}
printf(" +\n ");
for(i=ADD_SIZE-1;i>=0;i--)
{
op2[i]=rand();
op2[i]*=op2[i]*op2[i];
printf("%.8X",op2[i]);
}
printf(" =\n"-);
for(i=0;i<ADD_SIZE;i++)
printf("--------");
printf("\n");
for(c=i=0;i<ADD_SIZE;i++)
{
op3[i]=op2[i]+op1[i]+c;
if(((op3[i]-c)<op2[i])||((op3[i]-c)<op1[i]))
c=1;
else
c=0;
}
printf("%.1X",c);
for(i=ADD_SIZE-1;i>=0;i--)
printf("%.8X",op3[i]);
}
Nota: per aumentare la precisione modificare il 96 con un multiplo di 32 maggiore di 96.
The3DProgrammer
22-07-2006, 20:12
ciao a tutti
per l'università devo realizzare un programma in c (non in c++ o altro)
premesso che le mie conoscenze sono molto limitate, ilprogramma deve fare la sottrazione tra due numeri naturali di 20 cifre. o meglio da un numero di massimo 20 cifre ne va sottratto un altro qualsiasi
ho già realizzato un semplice programma di sottrazione tra due numeri, il problema e' che se inserisco numeri di oltre dieci cifre mi sballa tutto quanto
come posso fare per risolvere il problema?
potete aiutarmi ?
ma xkè nn provi con l'algoritmo "carta e penna" usando gli array?
anche a me ai suoi tempi hanno fatto questo quesito (con la differenza che i numeri potevano avere un numero di cifre indefinito) e la richiesta era di risolverlo espressamente in quel modo
ciauz
The3DProgrammer
22-07-2006, 20:15
E' un problema di dinamica...i numeri interi hanno in genere un range di 2^31 (2^32 gli unsigned), quindi fino a circa 2 (4) giga.
Gli interi a 64 bit arrivano a 2^63 (2^64 gli unsigned), ancora non sufficienti per gestire numeri decimali di venti cifre (2^64 = ~ 1.8*10^19)
Non puoi quindi risolvere il tuo problema con i numeri nativi del c; devi operare direttamente sulle stringhe ed "emulare" la matematica (ringrazia che ti hanno chiesto solo sottrazioni). Probabilmente il problema è studiato ad hoc per obbligarti a usare le stringhe per risolverlo.
credo che anche ilsensine si riferisca a questo:)
Energy++
23-07-2006, 08:55
bisognerebbe fare qualche piccola(:D) modifica però funziona (questo fa la somma)
#include <iostream>
#include <conio.h>
#include <cstdlib>
#define P 20
using namespace std;
char s1[P], s2[P];
int n1[P], n2[P], n3[P];
main(){
cout <<"Inserire il primo numero\n--> ";
gets(s1);
cout <<"\n\nInserire il secondo numero\n--> ";
gets(s2);
int l = strlen(s1), j=0;
for(int i=(P-l); i<P; i++){
n1[i] = s1[j]-48;
n2[i] = s2[j]-48;
j++;}
for(int i=(P-1); i>1; i--){
if(n1[i]+n2[i]>10){
n3[i] = (n1[i]+n2[i])-10;
n1[i-1] += 1;
}
else
n3[i] = n1[i]+n2[i];}
cout <<"risultato: ";
for(int i=0; i<P; i++)
cout <<n3[i];
cout <<"\n\n";
system("pause");
}
ciao ciao
Bel quesito (a meno di errori grossolani):
....
for(c=i=0;i<ADD_SIZE;i++)
{
op3[i]=op2[i]+op1[i]+c;
if(((op3[i]-c)<op2[i])||((op3[i]-c)<op1[i]))
c=1;
else
c=0;
}
....Ehm ... mi risulta che il calcolo del 'carry' è sbagliato.
Dati 2 valori a 96 bit (li scrivo in base 16):
00000000 FFFFFFFF FFFFFFFF +
00000000 00000000 00000001
La tua funzione produce il risultato:
00000000 00000000 00000000
mentre invece il risultato corretto è:
00000001 00000000 00000000
;)
repne scasb
23-07-2006, 10:08
Ehm ... mi risulta che il calcolo del 'carry' è sbagliato.
Vero. Questa "sembrerebbe" funzionare:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define ADD_SIZE (96/32)
void main(void)
{
unsigned long op1[ADD_SIZE],op2[ADD_SIZE],op3[ADD_SIZE];
int i,c;
time_t t;
srand((unsigned)time(&t));
printf(" ");
for(i=ADD_SIZE-1;i>=0;i--)
{
op1[i]=rand();
op1[i]*=op1[i]*op1[i];
printf("%.8X",op1[i]);
}
printf(" +\n ");
for(i=ADD_SIZE-1;i>=0;i--)
{
op2[i]=rand();
op2[i]*=op2[i]*op2[i];
printf("%.8X",op2[i]);
}
printf(" =\n-");
for(i=0;i<ADD_SIZE;i++)
printf("--------");
printf("\n");
for(c=i=0;i<ADD_SIZE;i++)
{
op3[i]=op2[i]+op1[i]+c;
if((op3[i]-c)>op3[i])
c=1;
else
{
if(((op3[i]-c)<op2[i])||((op3[i]-c)<op1[i]))
c=1;
else
c=0;
}
}
printf("%.1X",c);
for(i=ADD_SIZE-1;i>=0;i--)
printf("%.8X",op3[i]);
}
NOTA: Versione corretta.
Vero. Questa "sembrerebbe" funzionare:
...
for(c=i=0;i<ADD_SIZE;i++)
{
op3[i]=op2[i]+op1[i]+c;
if((op3[i]<op2[i])||(op3[i]<op1[i]))
c=1;
else
c=0;
}
...Non è per romperti le scatole ... ma non è ok nemmeno così.
00000000 FFFFFFFF FFFFFFFF +
00000000 FFFFFFFF 00000001
-----------------------------
00000001 FFFFFFFF 00000000
La tua funzione produce:
00000000 FFFFFFFF 00000000
Andre_Santarell
23-07-2006, 11:01
ciao, scusate per il ritardo, l'idea dei 96 bit potrebbe essere buona.. ma il mio prof non la appezzerebbe xké appunto mi ha datoil tutto apposta per farmi lavorare conlestringhe..
in questi giorni con l'aiuto di un mio amico siamo riusciti a fare quasi tutto, seguendo li spunti che mi dette Marinelli.
tuttavia il problema principale arriva quando si fa la sottrazione carattere x carattere
mettiamo che ad esempio si voglia fare 123 meno 4
sarebbe necessario che il programma legga i due numeri come 123 meno 004 e non come 123 meno 400
il problema infatti e' far partire ilprogramma a fare la sottrazione dall'ultima cifra e non dalla prima.. te hai consigli per fare ciò?
viceversa avevamo pensato di fare leggere al programma 123 come
00000000000000000123
meno
00000000000000000003
ossia aggiungendo all'inizio del numero tanti zeri quanti sono le cifre mancanti per arrivare a 20.
ma come fare questo?
una volta che si hanno i due numeri a 20 cifre complete si pensava di fargli fare una sottrazione tra prima cifra da sinistra del primo numero e prima cifra da sinistra del secondo numero. e che quindi controllasse che:
se la cifra del primo numero e' maggiore o uguale aquella del secondo faccia la semplice sottrazione tra due numeri e la memorizzi
se invece la cifra del primo numero è minore di quella del secondo consideri la prima cifra con l'aggiunta di 10, quindi faccia la normale sottrazione e scali il risultato dell' operazione delle due cifre precedenti di uno.
ci sono modi più rapidi?
grazie mille
ciao
Andrea
Andre_Santarell
23-07-2006, 11:04
bisognerebbe fare qualche piccola(:D) modifica però funziona (questo fa la somma)
#include <iostream>
#include <conio.h>
#include <cstdlib>
#define P 20
using namespace std;
char s1[P], s2[P];
int n1[P], n2[P], n3[P];
main(){
cout <<"Inserire il primo numero\n--> ";
gets(s1);
cout <<"\n\nInserire il secondo numero\n--> ";
gets(s2);
int l = strlen(s1), j=0;
for(int i=(P-l); i<P; i++){
n1[i] = s1[j]-48;
n2[i] = s2[j]-48;
j++;}
for(int i=(P-1); i>1; i--){
if(n1[i]+n2[i]>10){
n3[i] = (n1[i]+n2[i])-10;
n1[i-1] += 1;
}
else
n3[i] = n1[i]+n2[i];}
cout <<"risultato: ";
for(int i=0; i<P; i++)
cout <<n3[i];
cout <<"\n\n";
system("pause");
}
ciao ciao
grazie provo alavorare anche su questo
ciao
Andrea
Relativamente ai 96 bit, non si potrebbero utilizzare i long long per le somme intermedie, es.:
for (c = i = 0; i < ADD_SIZE; i++) {
unsigned long long tmp = (unsigned long long)op2[i] + op1[i] + c;
c = (tmp > ULONG_MAX);
op3[i] = (unsigned long)tmp;
}
Nell'ipotesi, ovviamente, di long di 32 bit e long long di 64... :D
Sub aaa()
a$ = "10000000000000000000"
b$ = "00000000000000000001"
c$ = "00000000000000000000"
ir = 0
For i = Len(a$) To 1 Step -1
ci = Val(Mid$(a$, i, 1)) + ir - Val(Mid$(b$, i, 1))
ir = (ci < 0)
ci = ci - ir * 10
Mid$(c$, i, 1) = Format$(ci)
Next i
End Sub
Fenomeno85
23-07-2006, 14:40
minchia da quanto tempo a :D
ma dove eri finito? :D
ci mancava il vb :D
~§~ Sempre E Solo Lei ~§~
:D 36 h ?
:D http://www.hwupgrade.it/forum/customavatars/avatar76766_0.gif
:D HPF is better
http://www.google.it/search?hl=it&q=HPF&meta=
:sborone:
Fenomeno85
23-07-2006, 15:00
:D 36 h ?
:D http://www.hwupgrade.it/forum/customavatars/avatar76766_0.gif
:D HPF is better
ah si :D ... va bhe non ti avevo visto :D
~§~ Sempre E Solo Lei ~§~
ma dove eri finito? :D
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N
.................................... ~ § ~ Lat.: 46° 00' N
Fenomeno85
23-07-2006, 15:26
Città: Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N
.................................... ~ § ~ Lat.: 46° 00' N
stai bene? :D
~§~ Sempre E Solo Lei ~§~
repne scasb
23-07-2006, 15:38
Non è per romperti le scatole ... ma non è ok nemmeno così.
00000000 FFFFFFFF FFFFFFFF +
00000000 FFFFFFFF 00000001
-----------------------------
00000001 FFFFFFFF 00000000
La tua funzione produce:
00000000 FFFFFFFF 00000000
Hai inviato il messarggio alle 11:24, alle 11:23 ho modificato la versione da te controllata, questa pare funzionare:
...
for(c=i=0;i<ADD_SIZE;i++)
{
op3[i]=op2[i]+op1[i]+c;
if((op3[i]-c)>op3[i])
c=1;
else
{
if(((op3[i]-c)<op2[i])||((op3[i]-c)<op1[i]))
c=1;
else
c=0;
}
}
...
repne scasb
23-07-2006, 15:42
Relativamente ai 96 bit, non si potrebbero utilizzare i long long per le somme intermedie, es.:
Certo, ma si sente meno "gusto".
Certo, ma si sente meno "gusto".
ir = 0
For i = 1 To II
ci = a(i) + ir - b(i)
ir = (ci < 0)
c(i) = ci - ir * 10
Next i
metà codice
metà tempo di calcolo
doppio gusto
:sborone:
questa pare funzionareSì, mi sembra che sia ok in tutti i casi. :)
repne scasb
23-07-2006, 18:41
metà codice
metà tempo di calcolo
doppio gusto
:sborone:
for i = 1 to II
c(i) = a(i) + 10 * (a(i) < b(i)) - b(i)
a(i + 1) = a(i + 1) - (a(i) < (b(i))
next i
Una riga in meno di codice.
Piu' lento.
Ma triplo gusto in quanto senza variabili temporanee.
repne scasb
23-07-2006, 18:46
Sì, mi sembra che sia ok in tutti i casi.
Mi sembra anche a me, adesso.
Non è per romperti le scatole...
Non mi rompi le scatole. Sono gratificata delle tue osservazioni, significa che qualcuno non guarda passivamente cio' che scrivo.
(a(i) < b(i)) ripetuto: matita blu.
torni al prossimo appello. :cool:
Sono grati-ficata delle tue osservazioni
:eek:
repne scasb
23-07-2006, 18:52
(a(i) < b(i)) ripetuto: matita blu.
torni al prossimo appello. :cool:
E' vero. Ma non volevo utilizzare varibili temporanee. Cosi' piace di piu':
for i = 1 to II
ci = a(i) < b(i)
c(i) = a(i) + 10 * ci - b(i)
a(i + 1) = a(i + 1) - ci
next i
repne scasb
23-07-2006, 18:59
:eek:
Hai troppa "divergenza del pensiero".
no: siamo sempre 8 a 10 per ciclo. :cool:
ma se mi grati-ficassi potrei anche andare a 4 righe di codice e 6 op :sborone:
Hai troppa "divergenza del pensiero".
guarda che le "variabili temporanee" (dette anche di "appoggio") sono luoghi riparati che alleviano la vita. :)
repne scasb
23-07-2006, 19:09
no: siamo sempre 8 a 10 per ciclo. :cool:
ma se mi grati-ficassi potrei anche andare a 4 righe di codice e 6 op :sborone:
Cosi':
ci = 0
for i = 1 to II
a(i) = a(i) - ci
ci = a(i) < b(i)
c(i) = a(i) + 10 * ci - b(i)
next i
no così:
For i = 1 To II
c(i) = CC(a(i), b(i), ir)
ir = IIr(a(i), b(i), ir)
Next i
4 righe di codice, 2 op
:sborone: :sborone:
where CC() and IIr are assigned as :
Dim CC(0 To 9, 0 To 9, -1 To 0) As Byte, IIr(0 To 9, 0 To 9, -1 To 0) As Byte
For a = 0 To 9: For b = 0 To 9: For ir = -1 To 0
c = a + ir - b
ir = (c < 0)
c = c - ir * 10
CC(a, b, ir) = c
IIr(a, b, ir) = ir
Next ir, b, a
allora mi grati-fichi ? :)
C'è una legge Fortraniana che dice:
TempoCalcolo +* MemoriaVar +* RigheCodice +* TempoSviluppo = Costante(ProgrammerSkill)
che viene in genere troncata come:
TempoCalcolo +* MemoriaVar = Costante(ProgrammerSkill)
è infallibile. :cool:
For i = 1 To II
c(i) = CC(a(i), b(i), ir)
ir = IIr(a(i), b(i), ir)
Next i
4 righe di codice, 2 op
:sborone: :sborone:
tra l'altro si presta ottimamente per un risultato stringhesco. :)
allora sta grati-fica ? :confused:
repne scasb
23-07-2006, 20:23
allora sta grati-fica ?
Direi di no.
For i = 1 To II
c(i) = CC(a(i), a(i+1), b(i), b(i+1))
Next i
Sto definendo (tentando di definire) la matrice CC...
sto seguendo e... rep sei stupenda...!!!!
x a2000.1... sei in gamba
Sto definendo (tentando di definire) la matrice CC...
1) pagare le royalties (copiona)
2) hai sempre un calcolo esplicito in più (oltre agli impliciti di indice matrice)
:D
repne scasb
23-07-2006, 20:28
Sto definendo (tentando di definire) la matrice CC...
Ho una soluzione per CC con II*2 dimensioni; mi pare troppo complessa.
sto seguendo e... rep sei stupenda...!!!!
x a2000.1... sei in gamba
swappa pure amico: è lei che è in gamba
(almeno spero)
e io sono stupendo :sborone:
Ho una soluzione per CC con II*2 dimensioni; mi pare troppo complessa.
La vita (e la matrice) te la sempli-fico io.
Se vuoi conosco un ristorantino sopra il lago maggiore ... :cool:
swappa pure amico: è lei che è in gamba
(almeno spero)
...e già, fratello la leggo da anni.
x cionci... ho copiato e icollato questo 3d... FAVOLOSO!!
(ma mi vuoi aiutare cionci...post privato)
no io intendo gamba nel senso di coscia. :rotfl:
il resto è accessorio (per tutti: maschi e foemine) :cinic:
ma se non ricordo male ... ho uno smell di primipara attempata ... :wtf:
repne scasb
23-07-2006, 20:55
1) pagare le royalties
Ok.
2) hai sempre un calcolo esplicito in più (oltre agli impliciti di indice matrice)
NOTA: II deve essere divisibile per 2, eseguo solo "mezzo" FOR.
For i = 1 To II
c(i) = CC(a(i), b(i))
i = i + 1
c(i) = DD(a(i), a(i-1), b(i), b(i-1))
Next i
Definire CC e DD appare fattibile ma mi serve del tempo.
dopo l'impero arriva il manierismo.
stai divagando: più righe di codice, più memoria, più tempo di calcolo, ecc. ... non ci siamo.
attieniti alla regola aurea:
C'è una legge Fortraniana che dice:
TempoCalcolo +* MemoriaVar +* RigheCodice +* TempoSviluppo = Costante(ProgrammerSkill)
che viene in genere troncata come:
TempoCalcolo +* MemoriaVar = Costante(ProgrammerSkill)
è infallibile. :cool:
tel chi':
c = CC(a, b) 'flautato a voce sul collo per ogni coppia a, b ... :pig:
1 riga di codice
1 operazione
tanto gusto ... :oink:
repne scasb
23-07-2006, 21:13
NOTA: II deve essere divisibile per 2, eseguo solo "mezzo" FOR.
For i = 1 To II
c(i) = CC(a(i), b(i))
i = i + 1
c(i) = DD(a(i), a(i-1), b(i), b(i-1))
Next i
Ragionamento errato. Questo pare corretto.
For i = 1 To II
a(i + 1) = CC(a(i), b(i))
c(i) = DD(a(i), b(i))
Next i
CC e DD sono elementari.
ragazza sono:
2 righe di codice e ben 3 operazioni esplicite
il limite per ora sono 2 righe di codice e 2 operazioni esplicite (assegnazioni)
riprova. :D
non solo ... ma vai anche a ravanare il vettore assegnato a() che ti ricordo, nei linguaggi seri (HPF), è passato per riferimento.
mah.
repne scasb
23-07-2006, 21:21
c = CC(a, b)
Questo non puo' funzionare. Manca la dipendenza introdotta dal carry. Esempio: a(1) e B(1) valgono 7 e 4, oppure 4 e 7. C(2) dipende dalla disposizione di A(1), B(1) (4/7 o 7/4). Nella tua funzione manca del tutto tale dipendenza. Ossia:
C(n)=f(A(n-1,b(n-1),a(n),b(n)).
Carry + sottrazione.
comunque finora il top è questo:
c = CC(a, b) 'flautato a voce sul collo per ogni coppia a, b ... :pig:
1 riga di codice
1 operazione
tanto gusto ... :oink:
Questo non puo' funzionare.
vai tranquilla che se ci vediamo può funzionare ...
comunque in scrittura VB è
c() = CC(a(), b())
il carry, anzi il curry, lo ri-porto io . :)
repne scasb
23-07-2006, 21:31
ragazza sono:
2 righe di codice e ben 3 operazioni esplicite
il limite per ora sono 2 righe di codice e 2 operazioni esplicite (assegnazioni)
riprova. :D
Analisi dei codici:
For i = 1 To II
c(i) = CC(a(i), b(i), ir)
ir = IIr(a(i), b(i), ir)
Next i
mio codice:
For i = 1 To II
a(i + 1) = CC(a(i), b(i))
c(i) = DD(a(i), b(i))
Next i
Tu: accesso per 2 volte a matrice a tre dimensioni.
Io: accesso per 2 volte a matrice a due dimensioni.
Tu: nessuna addizione.
Io: Una addizione.
Tu: Due assegnazioni: una a vettore, una a variabile.
Io: Due assegnazioni: due a vettore.
C'e' da capire se due accessi a matrici a tre dimensioni sono piu' lenti di un addizione e di un assegnazione a vettore.
Ora uno dei due tuoi accessi a matrici a tre dimensioni, compensa la mia assegnazione a vettore, quindi rimane da capire se un addizione e piu' veloce della differenza d'accesso tra una matrice a tre dimensioni ed una matrice a due dimensioni.
Secondo me l'addizione e' piu' veloce, da cui deduco che il mio codice e' piu' veloce.
Io : Tarzan
Tu : Jane
fare grum grum , si o no (-1, 0) ???
(cazzo, certe volte capiscono solo le tozze)
repne scasb
23-07-2006, 21:34
attendo PVT :)
Attendi vanamente.
repne scasb
23-07-2006, 21:36
fare grum grum , si o no (-1, 0) ???
Cambia hobby.
va buo', attendo vagamente ...
Cambia hobby.
Vuoi subdolamente dire che devo cambiare hobby => Obi => Fai da Te .... :wtf:
ssssorry .... lesbians may be ?
repne scasb
23-07-2006, 21:48
ssssorry .... lesbians may be ?
Se quanto scrive a2000.1 e' vero, deduco che la specie umana si estinguera' nella prossima generazione.
Ma non credo si estinguera'.
http://www.suspense-movies.com/stars/tarzan-jane/Jane4.jpg
http://www.complexnightclub.com/assets/images/Tarzan-_-Jane.gif
Ok. Chiudiamo qui perché la discussione è degenerata.
ciao ;)
Ok. Riapriamo la discussione perché repne scasb, come sicuramente molti altri utenti, è intenzionata a continuare in modo civile la discussione. Alla prima provocazione pero potrebbe scattare la sospensione per qualcuno...
ciao ;)
Andre_Santarell
24-07-2006, 19:13
ciao tornando al problemainiziale io devo convertire ancore questa stringa in intero.. ma mi da ancora errore
vi prego aiuto
mi serve x domani!!
L'HO riadattato ma non va ancora
*#include <stdlib.h>
#include <stdio.h>
#include <string.h>
* *
#define TERM 100
int main(int argc, char *argv[])
{
char num[21];
char num2[21];
printf("Inserisci il primo numero\n");
scanf("%s",&num);
printf("Inserisci il secondo numero\n");
scanf("%s",&num2);
*
//Inizio a copiare l'array char dentro un array int
unsigned int num_i[20];
unsigned int num_i2[20];
int pos;
char temp[2];
temp[1]='\0';
for (pos=0; pos<=20; pos++)
* {
temp[0]=num[pos];
num_i[pos]=atoi(temp);
* * * * * * * * * printf("%i\n",num_i[pos]);
* * * * }
temp[1]='\0';
for (pos=0; pos<=20; pos++)
{ *
temp[0]=num2[pos]; * * * * * * * * num_i2[pos]=atoi(temp);* * * * * * * * printf("%i\n",num_i2[pos]);
* }
int numero[20],numero2[20];
* * memset(numero,'0',sizeof(numero));
* * * memcpy(numero+20-strlen(num),num_i,strlen(num));
* * memset(numero2,'0',sizeof(numero2));
* * * * memcpy(numero2+20-strlen(num2),num_i2,strlen(num2));
return(0);
}
grazie
Andre_Santarell
24-07-2006, 19:23
per la sottrazione l'ho impostata così..
for (cicle=20;cicle>=0;cicle--)
48 {
49 if( numero[cicle] > numero2[cicle])
50 result[cicle] = numero[cicle] - numero2[cicle];
51 if( numero[cicle] < numero2[cicle])
52 {
53 numero[cicle-1]--;
54
The3DProgrammer
24-07-2006, 20:09
per la sottrazione l'ho impostata così..
for (cicle=20;cicle>=0;cicle--)
48 {
49 if( numero[cicle] > numero2[cicle])
50 result[cicle] = numero[cicle] - numero2[cicle];
51 if( numero[cicle] < numero2[cicle])
52 {
53 numero[cicle-1]--;
54
e se numero[cicle-1]==0?
;)
Andre_Santarell
24-07-2006, 20:33
ciao, questo programma mi sta facendo impazzire, qualche buon'anima potrebbe correggermelo? sotto quanto ho scritto io:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define TERM 100
int main(int argc, char *argv[])
{
char num[21];
char num2[21];
printf("Inserisci il primo numero\n");
scanf("%s",&num);
printf("Inserisci il secondo numero\n");
scanf("%s",&num2);
//Inizio a copiare l'array char dentro un array int
unsigned int num_i[20];
unsigned int num_i2[20];
int pos;
char temp[2];
temp[1]='\0';
for (pos=0; pos<=20; pos++)
{
temp[0]=num[pos];
num_i[pos]=atoi(temp);
printf("%i\n",num_i[pos]);
}
temp[1]='\0';
for (pos=0; pos<=20; pos++)
{
temp[0]=num2[pos];
num_i2[pos]=atoi(temp);
printf("%i\n",num_i2[pos]);
}
int numero[20],numero2[20];
memset(numero,'0',sizeof(numero));
memcpy(numero+20-strlen(num),num_i,strlen(num));
memset(numero2,'0',sizeof(numero2));
memcpy(numero2+20-strlen(num2),num_i2,strlen(num2));
//Inizio la sottrazione
int cicle,int result[20];
for (cicle=20;cicle>=0;cicle--)
{
if( sizeof(numero2) > sizeof(numero) )
printf("Errore! Perfavore inserire prima il numero maggiore!\n");
exit 0;
if( numero[cicle] > numero2[cicle])
result[cicle] = numero[cicle] - numero2[cicle];
if( numero[cicle] < numero2[cicle])
{
numero[cicle-1]--;
numero[cicle] += 10;
result[cicle] = numero[cicle] - numero2[cicle];
}
if( numero[cicle] < 0)
printf("Errore!\n");
printf("Il risultato della sottrazione è: %i",reult);
return(0);
}
Andre_Santarell
24-07-2006, 20:33
e se numero[cicle-1]==0?
;)
in effetti... te come lo metteresti ?
Se quanto scrive a2000.1 e' vero, deduco che la specie umana si estinguera' nella prossima generazione. non ho capito, intendevi dire che sarai tu a partorire tutti quelli della prossima generazione...? :mbe:
ammazza :huh:
Ma non credo si estinguera'. 333390xxxx :D
@Andre_Santarell: ma perché non provi ad applicare una delle efficienterrime versioni di a2000.1 e repne scasb? ^^
Andre_Santarell
25-07-2006, 14:07
ciao, perché il prof miha dato questo tipo di esercizio appositamente x farmi lavorare con le stinghe :)
un ringraziamento particolare al moderatore marinelli che questa notte mi ha mandato il codice corretto salvandomi :) inoltre mi ha supportato/sopportato in pvt durante tutti questi giorni!!
grazie davvero!
ps alla fine mi hanno dato 28..
The3DProgrammer
25-07-2006, 14:45
ps alla fine mi hanno dato 28..
LOL:D
repne scasb
25-07-2006, 16:17
un ringraziamento particolare al moderatore marinelli che questa notte mi ha mandato il codice corretto
Male. L'errore e l'identificazione dello stesso, sono una fase essenziale in un percorso d'apprendimento.
ps alla fine mi hanno dato 28..
Il tuo insegnate e' stato grandemente fuorviato.
Andre_Santarell
25-07-2006, 22:27
beh non e' che mi hanno chiesto solo il programma... :)
beh non e' che mi hanno chiesto solo il programma... :)
non solo, ma anche... e se non l'avessi saputo fare? :tapiro:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.