|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
[C] moltiplicazione interi
ciao a tutti devo moltiplicare due interi di lunghezza variabile
Codice:
#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; } int n=max(getlength2(num1),getlength2(num2)); int *res=(int *)malloc((n+n)*sizeof(int)); |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
qualcuno può rispondere alla domanda..invece di commentare inutilmente?!
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
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.
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
|
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
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.. |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
ora è + chiara come domanda?!
Ultima modifica di Misciu87 : 23-07-2008 alle 14:08. |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
non lo so neanche io dove ho segmentation fault penso sia per quelle due righe dato che servono per allocare memoria..
|
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
io lo eseguo con cygwin
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Tre dritte.
Prima, edita quei mille punti interrogativi che mi spaginano e non riesco più a seguire la discussione ![]() 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 ![]()
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
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 |
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
comunque la funzione mult dovrebbe fare proprio quello che hai detto tu..
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
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 ... Quote:
|
|
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
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 |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
quindi come andrebbe modificato?
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
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. |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Quote:
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
![]() |
![]() |
![]() |
#19 |
Member
Iscritto dal: Jun 2008
Messaggi: 55
|
come faccio? io non so mica fare..
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
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 ... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:13.