Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C] Moltiplicazione di interi di lunghezza arbitraria
Forum - C/C++ - [C] Moltiplicazione di interi di lunghezza arbitraria

Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 ] Precedente | Prossimo
Avatar
topolona (Normal User)
Newbie


Messaggi: 1
Iscritto: 16/07/2008

Segnala al moderatore
Postato alle 17:29
Mercoledì, 16/07/2008
Ho provato a implementare la funzione per l'addizione per poi usarla iterativamente per la moltiplicazione
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<time.h>
  4.  
  5. int getlength(char *list)
  6. {
  7.         int i=0;
  8.         while(list[i]!='\0') i++;
  9.         return i;
  10. }
  11.  
  12. int getlength2(int *list)
  13. {
  14.         int i=0;
  15.         while(list[i]!=-1) i++;
  16.         return i;
  17. }
  18.  
  19. int *loadlist(char *list)
  20. {
  21.         int n=getlength(list),i;
  22.         int *num=(int *)malloc((n+1)*sizeof(int));
  23.         char tmp;
  24.  
  25.         for(i=0; i<n; i++) {
  26.                 tmp=list[i];
  27.                 num[n-1-i]=atoi(&tmp);
  28.         }
  29.         num[n]=-1;
  30.         return num;
  31. }
  32.  
  33. void print(int *res, int i)
  34. {
  35.         if(res[i]!=-1) {
  36.                 print(res,i+1);
  37.                 if (i!=0) printf("%d",res[i]);
  38.                 else printf("%d\n",res[i]);    
  39.         }
  40. }
  41.  
  42. int max(int x, int y)
  43. {
  44.         if(x>=y) return x;
  45.         else return y;
  46. }
  47.  
  48.  
  49. int *add(int *num1, int *num2)
  50. {
  51.         int n=max(getlength2(num1),getlength2(num2))+100000;
  52.         int *res=(int *)malloc((n+10000)*sizeof(int));
  53.         int tmp,rest=0,i=0;
  54.  
  55.         while(num1[i]!=-1 && num2[i]!=-1)
  56.     {
  57.                 tmp=(num1[i]+num2[i]+rest);
  58.                 res[i]=tmp%10;
  59.                 rest=tmp/10;
  60.                 i++;
  61.         }      
  62.         if(num1[i]!=-1) {
  63.                  while(num1[i]!=-1)
  64.          {
  65.                         tmp=(num1[i]+rest);
  66.                         res[i]=tmp%10;
  67.                         rest=tmp/10;
  68.                         i++;
  69.                 }
  70.         } else if (num2[i]!=-1)
  71.       {
  72.                 while(num2[i]!=-1)
  73.         {
  74.                         tmp=(num2[i]+rest);
  75.                         res[i]=tmp%10;
  76.                         rest=tmp/10;
  77.                         i++;
  78.                 }
  79.         }
  80.         if(rest!=0) res[i++]=rest;
  81.         res[i]=-1;
  82.  
  83.         return res;
  84. }
  85.  
  86. int *mult(int *num1, int *num2)
  87. {
  88.    int n=max(getlength2(num1),getlength2(num2))+100000;
  89.    int *res=(int *)malloc((n+1000000)*sizeof(int));
  90.  
  91.    int i = 0;
  92.    for(i = 0; i < *num2; i++)
  93.    {
  94.       res = add(res, num1);
  95.    }
  96.    return res;
  97. }
  98.  
  99.  
  100. int main(int argc, const char *argv[])
  101. {
  102.     clock_t start, end;
  103.         int *num1, *num2, *res;
  104.         if(argc!=3)
  105.     {
  106.                 printf("Usage: add <integer 1> <integer 2>\n");
  107.                 return 1;
  108.         }
  109.         start=clock();
  110.         num1=loadlist((char *)argv[1]);
  111.         num2=loadlist((char *)argv[2]);
  112.         res=add(num1,num2);
  113.         res=mult(num1,num2);
  114.         end=clock();
  115.     printf("%g\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
  116.         print(res,0);
  117.         return 0;
  118. }


PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 19:05
Mercoledì, 16/07/2008
Ciao Misciu87 (michelle-87[at]libero.it) ... hai cambiato nick?

Prima di tutto vorrei capire ... saluti tutti e poi cambi nick e ti ripresenti con la solita richiesta di scrittura di codice senza alcun impegno ...

vedi:

http://forum.html.it/forum/showthread.php?s=&threadid=1253763

vedi :

http://www.hwupgrade.it/forum/showthread.php?p=23224925

Ma quale facolta' segui? Come fai a studiare se non ci metti un minimo di impegno? Come fai a dare esami se non hai la minima idea di quello che devi scrivere?

Senza offesa ... ovviamente ... ma e' veramente strana la tua situazione ...

Ultima modifica effettuata da gantonio il 16/07/2008 alle 19:22
PM Quote
Avatar
Misciu87 (Normal User)
Pro


Messaggi: 68
Iscritto: 01/07/2008

Segnala al moderatore
Postato alle 19:53
Mercoledì, 16/07/2008
scusa ma se un bel pezzo di codice me lo danno già cosi cosa lo devo cambiare? io devo solo aggiungerci dei pezzi ma seguire quello schema li..lo capisci che non ti sto chiedendo di scrivere il codice ma solo di darmi qualche dritta?!

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 20:11
Mercoledì, 16/07/2008
Testo quotato

Postato originariamente da Misciu87:

scusa ma se un bel pezzo di codice me lo danno già cosi cosa lo devo cambiare?



Ma cosa vuoi dire con questa frase? Cosa c'entra con quello che ti ho detto nell'ultimo post?

Testo quotato

io devo solo aggiungerci dei pezzi ma seguire quello schema li..



Aggiungerci dei pezzi? Devi realizzare il progetto che ti ha dato il professore da fare sulla moltiplicazione (unibo.it) prendendo come "esempio" quello sviluppato in classe per l'addizione ...

Come "esempio" ... cio' vuol dire che prendi quel codice e CI RAGIONI SOPRA, eliminando e modificando quello che serve ... e TE LO HANNO DETTO IN TUTTI I FORUM ...

Testo quotato

lo capisci che non ti sto chiedendo di scrivere il codice ma solo di darmi qualche dritta?!



Ti hanno dato TUTTI delle dritte ma sembra che tu NON CAPISCA nessun suggerimento e non sappia di cosa si sta parlando ... e quindi l'UNICO modo per arrivare a soluzione (COME IN ALTRI CASI per l'assembly) e' SCRIVERE TUTTO il codice ... e in tutti i forum ti hanno detto che questo non lo otterrai mai ... PERCHE' te lo hanno detto tutti ?


PM Quote
Avatar
Misciu87 (Normal User)
Pro


Messaggi: 68
Iscritto: 01/07/2008

Segnala al moderatore
Postato alle 23:13
Mercoledì, 16/07/2008
Questa funzione se vedi l'ho fatta io però..non capisco perche non vuoi aiutarmi non ti ho chiesto di fare un progetto dall'inizio alla fine..
Codice sorgente - presumibilmente C++

  1. int *mult(int *num1, int *num2)
  2. {
  3.    int n=max(getlength2(num1),getlength2(num2))+100000;
  4.    int *res=(int *)malloc((n+1000000)*sizeof(int));
  5.    
  6.    int i = 0;
  7.    for(i = 0; i < *num2; i++)
  8.    {
  9.       res = add(res, num1);
  10.    }
  11.    return res;
  12. }


PM Quote
Avatar
Misciu87 (Normal User)
Pro


Messaggi: 68
Iscritto: 01/07/2008

Segnala al moderatore
Postato alle 23:17
Mercoledì, 16/07/2008
[quote ti ripresenti con la solita richiesta di scrittura di codice senza alcun impegno ...


Io non ho richiesto nessuna scrittura di codice a nessuno..

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 23:17
Mercoledì, 16/07/2008
Ma chi ti ha detto che non ti vuole aiutare?

Lo abbiamo fatto in tanti ... per esempio, perche' hai scritto in quel modo le prime due righe?

A cosa serve il valore 100000 che hai inserito?

Ultima modifica effettuata da gantonio il 16/07/2008 alle 23:17
PM Quote
Avatar
Misciu87 (Normal User)
Pro


Messaggi: 68
Iscritto: 01/07/2008

Segnala al moderatore
Postato alle 23:18
Mercoledì, 16/07/2008
per l'allocazione di memoria

PM Quote
Avatar
Misciu87 (Normal User)
Pro


Messaggi: 68
Iscritto: 01/07/2008

Segnala al moderatore
Postato alle 23:21
Mercoledì, 16/07/2008
in quello dell'addizione c'era n+1 ma non basta per la moltiplicazione

PM Quote
Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 ] Precedente | Prossimo