PDA

Visualizza la versione completa : [C] Moltiplicazione interi lunghezza arbitraria


Misciu87
03-07-2008, 18:16
Il codice fa la moltiplicazione solo se gli inserisco nei numeri composta da una cifra solo per esempio 3*2, 2*2 ma non funziona con numeri di + cifre. Qualcuno può aiutarmi?



#include <stdio.h>
#include <stdlib.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))+1;
int *res=(int *)malloc((n+1)*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 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;
}
num1=loadlist((char *)argv[1]);
num2=loadlist((char *)argv[2]);
start=clock();
res=add(num1,num2);
end=clock();
printf("%g\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
print(res,0);
return 0;
}

Misciu87
05-07-2008, 11:01
C'è qualcuno che può darmi un aiuto?

mondobimbi
05-07-2008, 11:18
ma il programma non somma due numeri interi ?

Cosa non va ? Fai un esempio di imput e output perchè a me funziona.
ciao
sergio

Misciu87
07-07-2008, 20:24
io devo fare la moltiplicazione a partire da quello ho modificato questa riga

tmp=(num1[i]+num2[i]+rest);
cosi:
tmp=(num1[i]*num2[i]+rest);

ma se faccio moltiplicazioni con interi composti da una cifra funziona tipo 2*4,3*5,4*9 ecc. se invece moltiplico interi di più cifre tipo 20*14, 51*63, 100*36, 365*74 ecc non funziona sai aiutarmi?

Misciu87
09-07-2008, 08:49
mondobimbi puoi aiutarmi? o qualcun altro

oregon
09-07-2008, 10:37
Scusa ... ma se ho capito bene, la funzione e' l'addizione di piu' cifre ... non basta metterci un * per modificarla in moltiplicazione ... devi rivedere l'algoritmo e scrivere una NUOVA funzione per la moltiplicazione ...

Misciu87
09-07-2008, 11:39
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..

LeleFT
09-07-2008, 12:14
Se vuoi basarti sull'addizione per effettuare la moltiplicazione non devi cambiare quella dell'addizione, ma la devi usare iterativamente...

2 * 3 = 2 + 2 + 2

quindi, in termini di pseudo-codice:


func moltiplica(int a, int b) {
int iterator = 0;
int result = 0;
for(iterator = 0; iterator < b; iterator++) {
result = somma(result, a);
}
return result;
}


Se intendi scriverne un'altra, l'algoritmo è ovviamente diverso e va ripensato...


Ciao. :ciauz:

LexLex
09-07-2008, 14:02
Originariamente inviato da Misciu87
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..

Ma sei proprio sicuro che l'hai scritta tu ?? :master:

oregon
09-07-2008, 14:30
Originariamente inviato da LexLex
Ma sei proprio sicuro che l'hai scritta tu ?? :master:

Evidentemente no ...

Loading