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;
}
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))+1;
int *res=(int *)malloc((n+n)*sizeof(int));