Advertisement
Guest User

PP Numere mari

a guest
Oct 19th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct
  5. {
  6. int v[101];
  7. int nr_cifre;
  8. } nr_mare;
  9.  
  10. nr_mare a,b,s;
  11.  
  12. void nr_mare_Citire( )
  13. {
  14. int i;
  15.  
  16. //citim nr de cifre al fiecarui numar;
  17.  
  18. scanf("%d %d",&a.nr_cifre,&b.nr_cifre);
  19.  
  20. //citim cifrele fiecarui numar si le punem in vector in ordine inversa pentru a putea face suma incepand de la cifra unitatilor
  21.  
  22. //citesc cifrele lui a
  23. i=a.nr_cifre-1;
  24.  
  25. while( i >= 0 )
  26. {
  27. scanf("%d",&a.v[i]);
  28. i--;
  29. }
  30.  
  31. i=b.nr_cifre-1;
  32.  
  33. //citesc cifrele lui b
  34. while( i >= 0 )
  35. {
  36. scanf("%d",&b.v[i]);
  37. i--;
  38. }
  39. }
  40. nr_mare suma( nr_mare a, nr_mare b )
  41. {
  42. int transport=0;
  43. nr_mare c;
  44.  
  45. //c.nr_cifre reprezinta nr maxim de cifre pe care l-ar putea avea suma celor doua numere
  46.  
  47. if( a.nr_cifre > b.nr_cifre )
  48. c.nr_cifre = a.nr_cifre;
  49. else
  50. c.nr_cifre = b.nr_cifre;
  51.  
  52. //completam vectorul de cifre cu 0 acolo unde este nevoie
  53. //(numarul de cifre al numarului respectiv este mai mic decat numarul maxim de cifre pe care suma il poate avea)
  54.  
  55. for(int i=a.nr_cifre; i<c.nr_cifre; i++)
  56. a.v[i]=0;
  57.  
  58. for(int i=b.nr_cifre; i<c.nr_cifre; i++)
  59. b.v[i]=0;
  60.  
  61.  
  62. for( int i=0; i < c.nr_cifre; i++)
  63. {
  64. //incepand de la cifra unitatilor facem suma cifra cu cifra la care adaugam transportul obtinut de la cifrele anterioare
  65. // transportul initial este 0
  66.  
  67. int s=a.v[i] + b.v[i] + transport;
  68.  
  69. //in suma finala vom retine doar cifra unitatilor din suma, intrucat suma zecilor reprezinta transportul
  70. c.v[i]=s % 10;
  71. transport=s / 10;
  72. }
  73.  
  74. //daca inca mai avem transport trebuie sa-l adaugam la suma finala, deci si numarul de cifre al sumei se modifica
  75. if( transport > 0 )
  76. {
  77. c.nr_cifre++;
  78. c.v[c.nr_cifre-1]=transport;
  79. }
  80.  
  81. return c;
  82. }
  83. int comparare( nr_mare a, nr_mare b )
  84. {
  85. //-1 => a<b;
  86. // 0 => a=b;
  87. // 1 => a>b;
  88.  
  89. //daca a are mai multe cifre este clar ca a e mai mare
  90. if( a.nr_cifre > b.nr_cifre )
  91. return 1;
  92.  
  93. //la fel in cazul lui b
  94. if( b.nr_cifre > a.nr_cifre )
  95. return -1;
  96.  
  97. //a si b au acelasi nr de cifre si incepem sa comparam cifra cu cifra
  98. for( int i = 0; i < a.nr_cifre; i++ )
  99. if( a.v[i] > b.v[i] )
  100. return 1;
  101. else if( a.v[i] < b.v[i] )
  102. return -1;
  103.  
  104. //daca s-a ajuns aici inseamna ca a si b au toate cifrele egale
  105. return 0;
  106. }
  107. void afisare(nr_mare c)
  108. {
  109. int i;
  110.  
  111. // ultima cifra din c reprezinta de fapt prima cifra a sumei, penultima este a doua cifra, samd
  112. // deci afisarea sumei se va face in ordine inversa
  113.  
  114. for( i=c.nr_cifre-1; i >= 0 ; i-- )
  115. printf("%d",c.v[i]);
  116.  
  117. printf("\n");
  118. }
  119. int main()
  120. {
  121. nr_mare_Citire( );
  122. s= suma( a, b );
  123. afisare( s );
  124. printf("%d",comparare( a, b ));
  125. return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement