Guest User

Untitled

a guest
Jan 23rd, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.75 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. void lerVetor(int v[]){
  4.  
  5.   int i=0;
  6.  
  7.   do{
  8.     scanf("%d", &v[i]);
  9.     i++;
  10.   }while(v[i-1]!=-1); /* Le ate achar um numero -1 */
  11. }
  12.  
  13. void imprimirVetor(int v[]){
  14.  
  15.   int i=0;
  16.   /* Imprime ateh antes de acha um -1 */
  17.   while(v[i]!=-1){
  18.     printf("%d", v[i]);
  19.     i++;
  20.   }
  21.   printf("\n");
  22. }
  23.  
  24. void inverter(int v[]){
  25.  
  26.   int i=0;
  27.   int j=0;
  28.   int aux[102];
  29.  
  30.   /* Inverte um vetor, utilizando outro apara auxiliar */
  31.   while(v[i]!=-1){
  32.     i++;
  33.   }
  34.   i--;
  35.  
  36.   while(i>=0){
  37.     aux[j]=v[i];
  38.     i--;
  39.     j++;
  40.   }
  41.  
  42.   for(i=0;i<j;i++){
  43.     v[i]=aux[i];
  44.   }
  45.  
  46.   v[i]=-1;
  47. }
  48.  
  49. void somarVetor(int v1[], int v2[], int soma[]){
  50.  
  51.   int i,j,k;
  52.   int care=0;
  53.  
  54.   i=j=k=0;
  55.  
  56.   /* Soma os vetores n1 e n2 ateh os dois chegarem ao -1 */
  57.   while(v1[i]!=-1 || v2[j]!=-1){
  58.     /* Se nenhum dos dois chegou ao fim */
  59.     if(v1[i]!=-1 && v2[j]!=-1){
  60.       soma[k]=(v1[i]+v2[j]+care)%10;
  61.       care=(v1[i]+v2[j]+care)/10;
  62.       i++;j++;k++;
  63.     }
  64.     /* Se o segundo vetor chegou ao fim, copia o valor do primeiro vetor */
  65.     else if(v2[j]==-1){
  66.       soma[k]=(v1[i]+care)%10;
  67.       care=(v1[i]+care)/10;
  68.       i++;
  69.       k++;
  70.     }
  71.     /* Se o primeiro vetor chegou ao fim, copia o valor do segundo vetor */
  72.     else if(v1[i]==-1){
  73.       soma[k]=(v2[j]+care)%10;
  74.       care=(v2[j]+care)/10;
  75.       j++;
  76.       k++;
  77.     }
  78.   }
  79.   if(care==1){ soma[k]=1; soma[k+1]=-1;}
  80.   else soma[k]=-1;
  81. }
  82.  
  83. void copiarVetor(int v1[], int v2[], int n){
  84.  
  85.   int i;
  86.  
  87.   for(i=0;i<n;i++) v1[i]=v2[i];
  88.  
  89. }
  90.  
  91. void zerarVetor(int v[], int n){
  92.   int i;
  93.  
  94.   for(i=0;i<n;i++) v[i]=0;
  95. }
  96.  
  97. void multiplicar(int v1[], int v2[], int mult[]){
  98.  
  99.   int i, j;
  100.   int care=0;
  101.   int aux1[102]={0}, aux2[102]={0};
  102.  
  103.   /*   Pega o primeiro digito do primeiro vetor e multiplica ele o segundo vetor por esse digito */
  104.   /*   Soma o resultado parcial com o resultado final */
  105.   /*   Avança para o proximo digito do primeiro vetor, faz tudo isso ate */
  106.   /*   chegar ao -1 */
  107.   for(j=0;v1[j]!=-1;j++){
  108.     care=0;
  109.     if(v1[j]==0) continue;
  110.     for(i=0;v2[i]!=-1;i++){
  111.       aux1[j+i]=(v1[j]*v2[i]+care)%10;
  112.       care=(v1[j]*v2[i]+care)/10;
  113.     }
  114.     if(care!=0) { aux1[j+i]=care; aux1[j+i+1]=-1;}
  115.     else aux1[j+i]=-1;
  116.  
  117.     if(j>0) copiarVetor(aux2, mult,102);
  118.     else { aux2[0]=0; aux2[1]=-1; }
  119.     somarVetor(aux1, aux2, mult);
  120.     zerarVetor(aux1, 102);
  121.     zerarVetor(aux2, 102);
  122.   }
  123. }
  124.  
  125. int main(){
  126.  
  127.   int n1[51]={0}, n2[51]={0};
  128.   int soma[102], mult[102]={0};
  129.  
  130.   lerVetor(n1);
  131.   lerVetor(n2);
  132.   imprimirVetor(n1);
  133.   imprimirVetor(n2);
  134.   inverter(n1);
  135.   inverter(n2);
  136.   somarVetor(n1, n2, soma);
  137.   inverter(soma);
  138.   imprimirVetor(soma);
  139.   multiplicar(n1,n2,mult);
  140.   inverter(mult);
  141.   imprimirVetor(mult);
  142.  
  143.   return 0;
  144. }
Add Comment
Please, Sign In to add comment