View Full Version : [C] moltiplicazione interi
Misciu87
23-07-2008, 13:05
ciao a tutti devo moltiplicare due interi di lunghezza variabile
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int getlength(char *list)
{
int i=0;
while(list[i]!='\0') i++;
return i;
}
int getlength2(int *list)
{
int i=0;
while(list[i]!=-1) i++;
return i;
}
int *loadlist(char *list)
{
int n=getlength(list),i;
int *num=(int *)malloc((n+1)*sizeof(int));
char tmp;
for(i=0; i<n; i++) {
tmp=list[i];
num[n-1-i]=atoi(&tmp);
}
num[n]=-1;
return num;
}
void print(int *res, int i)
{
if(res[i]!=-1) {
print(res,i+1);
if (i!=0) printf("%d",res[i]);
else printf("%d\n",res[i]);
}
}
int max(int x, int y)
{
if(x>=y) return x;
else return y;
}
int *add(int *num1, int *num2)
{
int n=max(getlength2(num1),getlength2(num2))+100000;
int *res=(int *)malloc((n+10000)*sizeof(int));
int tmp,rest=0,i=0;
while(num1[i]!=-1 && num2[i]!=-1)
{
tmp=(num1[i]+num2[i]+rest);
res[i]=tmp%10;
rest=tmp/10;
i++;
}
if(num1[i]!=-1) {
while(num1[i]!=-1)
{
tmp=(num1[i]+rest);
res[i]=tmp%10;
rest=tmp/10;
i++;
}
} else if (num2[i]!=-1)
{
while(num2[i]!=-1)
{
tmp=(num2[i]+rest);
res[i]=tmp%10;
rest=tmp/10;
i++;
}
}
if(rest!=0) res[i++]=rest;
res[i]=-1;
return res;
}
int *mult(int *num1, int *num2)
{
int n=max(getlength2(num1),getlength2(num2))+100000;
int *res=(int *)malloc((n+1000000)*sizeof(int));
int i = 0;
for(i = 0; i < *num2; i++)
{
res = add(res, num1);
}
return res;
}
int main(int argc, const char *argv[])
{
clock_t start, end;
int *num1, *num2, *res;
if(argc!=3)
{
printf("Usage: add <integer 1> <integer 2>\n");
return 1;
}
start=clock();
num1=loadlist((char *)argv[1]);
num2=loadlist((char *)argv[2]);
res=add(num1,num2);
res=mult(num1,num2);
end=clock();
printf("%g\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
print(res,0);
return 0;
}
nella funzione mult le righe per l'allocazione di memoria possono andare bene cosi perche mi segnala un errore di segmentation fault
int n=max(getlength2(num1),getlength2(num2));
int *res=(int *)malloc((n+n)*sizeof(int));
variabilepippo
23-07-2008, 13:20
Perché aprire una nuova discussione quando c'è questa (http://www.hwupgrade.it/forum/showthread.php?t=1776301)? :confused:
Misciu87
23-07-2008, 13:26
qualcuno può rispondere alla domanda..invece di commentare inutilmente?!
qualcuno può rispondere alla domanda..invece di commentare inutilmente?!
Sì ma sono 20 giorni che tra questo e altri forum (Tofy, Html.it...) ancora non ci hai spiegato a cosa servono le due funzioni getlength, quale algoritmo hai usato per la moltiplicazione... altrimenti anche volendo non vedo come possiamo aiutarti.
variabilepippo
23-07-2008, 13:37
qualcuno può rispondere alla domanda..invece di commentare inutilmente?!
Qui nessuno è al tuo servizio e visto che esistono delle regole da rispettare e bene che inizi a farlo. Il fatto che tu non riceva risposte non ti autorizza ad aprire nuove discussioni (cosa, che come segnalato da Albi89, fai anche su altri forum).
Misciu87
23-07-2008, 13:46
L'altra discussione mi sembra che l'abbiamo chiusa non mi ricordo..mi dispiace se se ho aperta un'altra..
Per albi: adesso ti spiego come stanno le cose: il prof ci ha passato quel programma che fa l'addizione ma senza spiegarcelo,io devo modificare quello per fare la moltiplicazione..
da quello che sono riuscita a capire getlenght conta la lunghezza dei due numeri e poi li usa per allocare spazio in memoria.
Come qualcuno mi ha suggerito ho creato la funzione mult per usare iterativamente la add ed arrivare cosi alla moltiplicazione..
Misciu87
23-07-2008, 13:54
}
nella funzione mult le righe per l'allocazione di memoria possono andare bene cosi perche mi segnala un errore di segmentation fault????
int n=max(getlength2(num1),getlength2(num2));
int *res=(int *)malloc((n+n)*sizeof(int));
ora è + chiara come domanda?!
Misciu87
23-07-2008, 13:58
non lo so neanche io dove ho segmentation fault penso sia per quelle due righe dato che servono per allocare memoria..
Misciu87
23-07-2008, 14:02
io lo eseguo con cygwin
Tre dritte.
Prima, edita quei mille punti interrogativi che mi spaginano e non riesco più a seguire la discussione :sofico:
Seconda, quando riservi spazio ricordati che il prodotto di due numeri può avere tante cifre quante la somma delle cifre dei due numeri. Tienine conto nel riservare lo spazio.
Terza, se usi la funzione add che già hai ti basterà usare uno dei due fattori come limite del ciclo, inizializzare un valore accumulatore a 0, e sommare in ciclo l'altro fattore all'accumulatore.
Penso che ora ne sai abbastanza per prendere 30 ;)
Misciu87
23-07-2008, 14:10
mi hanno detto che n+n è troppo come spazio..
per la seconda parte non ho ben capito..30 ce l'ho già e lo vorrei mantenere devo consegnare il progetto entro il 25
Misciu87
23-07-2008, 14:12
comunque la funzione mult dovrebbe fare proprio quello che hai detto tu..
lorenzo001
23-07-2008, 15:12
mi hanno detto che n+n è troppo come spazio..
Ma troppo non fa male ...
Deve essere la
lunghezza del primo + la lunghezza del secondo
ma il massimo delle due lunghezze * 2 va bene lo stesso ...
per la seconda parte non ho ben capito..30 ce l'ho già e lo vorrei mantenere devo consegnare il progetto entro il 25
Beh ... mi sembra un po' tardi ... avresti dovuto studiare un po' prima ...
Misciu87
23-07-2008, 15:30
Tre dritte.
Terza, se usi la funzione add che già hai ti basterà usare uno dei due fattori come limite del ciclo, inizializzare un valore accumulatore a 0, e sommare in ciclo l'altro fattore all'accumulatore.
La funzione mult mi sembra faccia questo?
lorenzo001
23-07-2008, 15:41
La funzione mult mi sembra faccia questo?
A prima vista, no.
Ad esempio, nella for, nel controllo
i < *num2
*num2 corrisponde ad una cifra di num2 (dato che i numeri sono scritti con una cifra per ogni elemento del vettore) e non corrisponde al valore complessivo di num2 ...
Per intenderci, se num2 vale
1 9 6 5
*num2 vale 5
Misciu87
23-07-2008, 15:55
quindi come andrebbe modificato?
lorenzo001
23-07-2008, 16:33
Beh ... prima di tutto, devi azzerare la variabile in cui accumulerai il risultato prima della for ... scrivendo
res=loadlist("0");
e poi devi scriverti una piccola funzione che ti trasformi il valore numerico contenuto nel vettore num2[] sotto forma di sequenze di cifre, in un vero e proprio valore numerico contenuto in un int.
Beh ... prima di tutto, devi azzerare la variabile in cui accumulerai il risultato prima della for ... scrivendo
res=loadlist("0");
e poi devi scriverti una piccola funzione che ti trasformi il valore numerico contenuto nel vettore num2[] sotto forma di sequenze di cifre, in un vero e proprio valore numerico contenuto in un int.
A questo scopo potrebbe convenirti usare una funzione di libreria partendo dal char* contenuto in argv.
Misciu87
23-07-2008, 16:58
come faccio? io non so mica fare..
lorenzo001
23-07-2008, 17:50
come faccio? io non so mica fare..
Beh ... e' molto semplice ...
Scusa ... ma che significa "io non so mica fare ..." ... ?
Se continuo a scriverti il codice, praticamente ti scrivo io l'esercizio e questo, oltre ad essere vietato dal regolamento, non e' corretto ... mica lo devo prendere io il 30 !
Se volevi una dritta ne hai avuta piu' di una ... se volevi scritto tutto l'esercizio, dovevi dirlo chiaramente prima ...
variabilepippo
23-07-2008, 17:54
se volevi scritto tutto l'esercizio, dovevi dirlo chiaramente prima ...
Questa lettura (http://forum.html.it/forum/showthread.php?s=&threadid=1253763) è illuminante... :rolleyes:
Dopo aver preso chissà dove uno spezzone di codice che effettua l'addizione tra numeri sta cercando qualcuno che implementi la moltiplicazione al posto suo.
lorenzo001
23-07-2008, 18:00
Questa lettura (http://forum.html.it/forum/showthread.php?s=&threadid=1253763) è illuminante... :rolleyes:
Ah ... bene ... anzi, male ...:banned:
Dopo aver preso chissà dove uno spezzone di codice che effettua l'addizione
Se ho capito dal link che hai postato, lo ha dato il professore in
http://www.cs.unibo.it/~dilena/progetto2/
e la mult e' l'esercizio richiesto ...
variabilepippo
23-07-2008, 18:07
Se ho capito dal link che hai postato, lo ha dato il professore in
Quindi ci sono 2 opzioni:
1) Visto che l'utente sostiene di aver scritto quel codice, l'utente è il professore
2) L'utente sta cercando qualcuno che svolga il compito al posto suo, dunque ha mentito affermando:
"non puoi aiutarmi a modificarla perche io ho fatto quella dell'addizione perche mi sembrava più facile, cosi poi potevo basarmi su quello per fare la moltiplicazione ma non riesco a modificarlo.."
Io voto per la seconda. :banned:
Misciu87
23-07-2008, 18:39
mamma mia ma torniamo con le offese.. l'ho pur detto che la funzione dell'addizione l'ha messa il prof ma quella mult l'ho scritta io..
variabilepippo
23-07-2008, 18:49
l'ho pur detto che la funzione dell'addizione l'ha messa il prof ma quella mult l'ho scritta io..
Nessuna offesa, ho solo riportato quanto scritto da te:
"non puoi aiutarmi a modificarla perche io ho fatto quella dell'addizione perche mi sembrava più facile, cosi poi potevo basarmi su quello per fare la moltiplicazione ma non riesco a modificarlo.."
"La so fare una moltiplicazione in colonna, non so implementarla in C magari..non hai pensato a questo vero.. dall'addizione alla moltiplicazione ci saranno poche modifiche da fare..non penso che perderete molto tempo a farla.."
Confermi? L'accendiamo? :rolleyes:
Misciu87
23-07-2008, 19:05
carissimo non ho scritto queste cose in questa discussione!!:muro:
variabilepippo
23-07-2008, 19:08
Le hai scritte in un'altra... Cosa cambia? :fagiano:
Comunque torniamo al problema, a che punto sei arrivato? Ci sono novità, progressi?
Misciu87
23-07-2008, 19:23
arrivata a che punto sei arrivata!!
ora esco quindi nn ci posso guardare..
Misciu87
24-07-2008, 08:43
potresti spiegarmi come mettere a posto quel *num2?
lorenzo001
24-07-2008, 08:49
potresti spiegarmi come mettere a posto quel *num2?
Ti aveva gia' scritto Albi89 ...
A questo scopo potrebbe convenirti usare una funzione di libreria partendo dal char* contenuto in argv.
Misciu87
24-07-2008, 08:55
non so cosa vuol dire..
lorenzo001
24-07-2008, 08:57
non so cosa vuol dire..
Mi sembra chiaro ...
Misciu87
24-07-2008, 08:59
dai per favore mi manca solo quello.. non capisco cosa devo fare..
lorenzo001
24-07-2008, 09:02
dai per favore mi manca solo quello.. non capisco cosa devo fare..
Ora sto partendo ... ci risentiamo domani nel pomeriggio ...
Misciu87
24-07-2008, 09:04
ma che ti costa spiegarmi un attimo lo devo consegnare entro domani.. tu mi avevi detto di fare un ciclo per trasfromarlo in int come lo devo fare?
Misciu87
24-07-2008, 09:24
volevo solo dire che se mi spieghi cosa devo fare poi lo faccio io..
Misciu87
24-07-2008, 09:31
non so cosa sia argv non me l'ha mai spiegato nessuno..
variabilepippo
24-07-2008, 09:40
non so cosa sia argv non me l'ha mai spiegato nessuno..
Viene spiegato nelle primissime pagine di qualsiasi libro sul linguaggio C... E comunque basta la volontà di effettuare una semplice ricerca con Google per scoprire di cosa si tratti. :rolleyes:
http://publications.gbdirect.co.uk/c_book/chapter10/arguments_to_main.html
Misciu87
24-07-2008, 10:03
magari in italiano
Dai è fatto sei a cavallo insomma... :fagiano:
Con atoi() hai risolto ;)
Una volta che hai l'intero, puoi usarlo per ciclare.
Misciu87
24-07-2008, 12:01
scusa albi ma non ho capito bene mi potresti spiegare bene cosa devo fare? grazie mille
scusa albi ma non ho capito bene mi potresti spiegare bene cosa devo fare? grazie mille
Per poter impostare il ciclo devi avere un intero ovviamente.
Tu hai a disposizione il numero preso come stringa (ed è memorizzato in un array di char*, appunto argv).
Non sono un drago del C (per cose simile avrei usato gli stringstream C++), ma penso che dovrebbe bastare un:int i = atoi(argv[1]);
per avere il numero di ripetizioni ;)
Misciu87
24-07-2008, 13:36
lo metto prima del for? e poi nel ciclo for lascio i<*num2?
Misciu87
24-07-2008, 13:40
io avevo capito che dovevo fare un a funzione diciamo l'inverso di quello che fa loadlist.. cioè in loadlist il numero lo mette in un vettore, e io devo fare una funzione in modo che da vettore torni intero
forse però ho capito male..
io avevo capito che dovevo fare un a funzione diciamo l'inverso di quello che fa loadlist.. cioè in loadlist il numero lo mette in un vettore, e io devo fare una funzione in modo che da vettore torni intero
forse però ho capito male..
Sì può anche essere un'idea, però avendo il numero sotto forma di char* ti conviene utilizzare quello piuttosto che fare una nuova funzione.
Misciu87
24-07-2008, 14:08
int i = atoi(argv[1]);
però inserendo questa riga di codice non va lo stesso
Misciu87
24-07-2008, 14:56
ecco come l'ho modificato
int *mult(int *num1, int *num2,const char *argv[])
{
int n = getlength2( num1 ) + getlength2( num2 );
int *res=(int *)malloc((n)*sizeof(int));
int i = 0;
res=loadlist("0");
*num2 = atoi(argv[2]);
for(i = 0; i < *num2; i++)
{
res = add(res, num1);
}
return res;
}
ora funziona però fino a numeri con 8 cifre, poi mi dice segmentation fault, da cosa è dovuto? può dipendere dal mio computer che è vecchio crollo oppure è sempre un problema di memoria?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.