Guest User

Untitled

a guest
Jan 23rd, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. #include<stdio.h>
  2. void soma (int n1[], int n2[],int a, int b, int *n, int d[])//esta é a funçao que realiza a soma dos vetores, os parametros indicados sao respectivamente os vetores n1 e n2, a posiçao onde esta alocada o ultimo algarismo de cada, um parametro n que sera utilizado para detectar qual posiçao é maior, e o vetor de saida
  3. {
  4.  
  5. int i=0, aux=0, c;
  6. if(a>=b)//teste para verificar qual a maior posiçao
  7. *n=a;
  8. else{
  9. if(b>a)
  10. *n=b;
  11. }
  12. d[*n];
  13. for(i=0;i<=*n;i++){//realizaçao da soma
  14. c = n1[a-i]+n2[b-i]+aux;
  15. if (c>9){//se a soma de dois termos resultar em numero maior que 9 realiza o carry("vai-um") para o proximo algarismo, e fornece como resultado da soma somente o algarismo das unidades
  16. aux=c/10;
  17. c=c%10;
  18. }
  19. d[*n-i]=c;
  20. }
  21. }
  22. void multip(int n1[], int n2[], int a, int b, int m, int g[]){//funçao de multiplicaçao
  23. int i,j, k, h[100], c, aux=0, d, e, t[100];
  24. for(i=0;i<100;i++){
  25. t[i]=0;
  26. h[i]=0;
  27. }
  28. for(i=0;i<b;i++){
  29. for(k=0;k<a;k++){//IDEIA: armazenar em um vetor a multiplicaçao do ultimo algarismo de n2 por todos de n1, apos isso somar com o vetor g, fazer isso todas as vezes diminuindo em uma um a posiçao do ultimo algarismo do proximo vetor, e ir somando
  30. c=(n1[a-k]*n2[b-i])+aux;
  31. if(c>9){
  32. aux=c/10;
  33. c=c%10;
  34. }
  35. h[99-k]=c;
  36. }
  37. d=99-i;
  38. soma_mult(h, t, 99, d, d, g);
  39. for(j=0;j<100;j++)
  40. t[i]=g[i];
  41. for(k=0;k<100;k++)
  42. h[i]=0;
  43. aux=0;
  44. }
  45. }
  46. int main() {
  47. int n1[100], n2[100], i, a, b, n, d[100], g[100], m;//foram utilizados vetores de 100 casas decimais, para dessa forma poder ser efetuado o carry sem problemas, assim a multiplicaçao de dois numeros de 50 algarismos possa resultar em um de 100 algarismos
  48. for(i=49;i<100;i++){//vetor n1:utilizado para alocaçao dos numeros somente metade do vetor para assim garantir que possa haver o carry, fica alocada em uma variavel a maior posiçao onde ha algarismos
  49. scanf("%d", &n1[i]);
  50. if(n1[i]==-1){
  51. a=i-1;
  52. break;
  53. }
  54. }
  55. for(i=0;i<49;i++){//foram zeradas as 50 primeiras posiçoes para assim nao haver problemas com uma eventual ultrapassagem da quantidade de casas na multiplicaçao e soma
  56. n1[i]=0;
  57. n2[i]=0;
  58. }
  59.  
  60. for(i=49;i<100;i++){//idem ao que foi feito ao vetor n1
  61. scanf("%d", &n2[i]);
  62. if(n2[i]==-1){
  63. b=i-1;
  64. break;
  65. }
  66. }
  67. for(i=49;i<=a;i++){//aqui é imprimido o vetor n1
  68. printf("%d", n1[i]);
  69. if(i==a)
  70. printf("\n");
  71. }
  72. for(i=49;i<=b;i++){//aqui é imprimido o vetor n2
  73. printf("%d", n2[i]);
  74. if(i==b)
  75. printf("\n");
  76. }
  77. soma(n1, n2, a, b,&n, d);//chamada a funçao soma
  78. if (d[48]!=0){//se na soma nao houve carry na soma dos ultimos algarismos dos vetores, ele imprimime somente a quantidade de casas igual do maior vetor
  79. for(i=48;i<=n;i++){
  80. printf("%d", d[i]);
  81. if (i==n)
  82. printf("\n");
  83. }
  84. }
  85. else {//se houve carry na ultima soma, entao imprime a quantidade de posiçoes mais 1, para assim imprimir o ultimo carry
  86. for(i=49;i<=n;i++){
  87. printf("%d", d[i]);
  88. if (i==n)
  89. printf("\n");
  90. }
  91. }
  92. for(i=0;i<100;i++)//sao zerados todas as posiçoes do vetor, para evitar que haja alguma operaçao indesejada, com algum algarismo tipo "lixo"
  93. g[i]=0;
  94. multip(n1, n2, a, b, m, g);
  95. for (i=0;i<=99;i++){
  96. printf("%d", g[99-i]);
  97. }
  98. return 0;
  99. }
Add Comment
Please, Sign In to add comment