fork download
  1. /*
  2. Se citesc doua siruri de numere intregi, fiecare sir citindu-se pana la
  3. intalnirea numarului 0 (numarul zero nu face parte din sir). Sa se verifice
  4. daca cele doua siruri formeaza doua multimi de numere direct proportionale sau
  5. invers proportionale.
  6. Hint:
  7. Elementele celor doua siruri le memoram in doi vectori notati cu A si B.
  8. Daca cei doi vectori au numar diferit de elemente atunci nu se poate
  9. vorbi despre proportionalitate. Trebuie sa formam perechi cu Elementele
  10. celor doi vectori (o pereche fiind formata dintr-un element al vectorului A si
  11. un element al vectorului B) astfel incat rapoartele (in cazul proportionalitatii
  12. directe) si produsele (in cazul proportionalitatii inverse) perechilor sa fie egale.
  13. Pentru aceasta ordonam elementele celor doi vectori in ordine crescatoare. In
  14. cazul proportionalitatii directe o pereche este formata din elementele situate
  15. pe aceeasi pozitie in cei doi vectori. In cazul proportionalitatii inverse se grupeaza
  16. primul element din vectorul A cu ultimul element din vectorul B, al doilea element
  17. din vectorul A cu penultimul element din vectorul B, etc...
  18. */
  19. #include <stdio.h>
  20. #define DIM 100
  21.  
  22. int arr[DIM], n, i,
  23. arr2[DIM], m, j;
  24.  
  25. void countingSort(int *p, int n) {
  26.  
  27. int B[100],C[100];
  28.  
  29. for(int i = 1; i <= n; ++i) C[i] = p[i], B[i] = 0;
  30.  
  31. for(int i = 1; i < n; ++i) {
  32.  
  33. for(int j = i + 1; j <= n; j++) {
  34.  
  35. if(C[i] > C[j]) {
  36. B[i]++;
  37. } else {
  38. B[j]++;
  39. }
  40. }
  41. }
  42.  
  43. for(int i = 1; i <= n; ++i) p[B[i]+1] = C[i];
  44. }
  45.  
  46. int main(int argc, char const *argv[]) {
  47.  
  48. int x;
  49. n = m = 0;
  50.  
  51. printf("Arr 1 ->\n");
  52.  
  53. while(x!=0) {
  54.  
  55. scanf("%d", &x);
  56. arr[++n] = x;
  57. }
  58.  
  59. n--;
  60.  
  61. printf("Arr 2 ->\n");
  62. x = -1;
  63.  
  64. while(x!=0) {
  65.  
  66. scanf("%d", &x);
  67. arr2[++m] = x;
  68. }
  69. m--;
  70.  
  71. int est_dir_prop = 1,
  72.  
  73. est_inv_prop = 1;
  74.  
  75. //only the number of elements from first vector is equal with the number of element
  76. //from second vector; otherwise doesn't work the solution
  77. if(n == m) {
  78.  
  79. //sort first vector
  80. countingSort(arr,n);
  81.  
  82. //sort second vector
  83. countingSort(arr2,n);
  84.  
  85. float correct = arr[1] / arr2[1];
  86. //printf("%f", correct);
  87. for(i = 2; i <= n; ++i) {
  88.  
  89. if((float)(arr[i] / arr2[ i ]) != correct) {
  90.  
  91. est_dir_prop = 0;
  92. }
  93. }
  94.  
  95. correct = arr[1] * arr2[n];
  96.  
  97. for(i = 2; i <= n; ++i) {
  98.  
  99. if(arr[i] * arr2[n-i+1] != correct) {
  100. est_inv_prop = 0;
  101. break;
  102. }
  103. }
  104.  
  105. if(est_dir_prop) printf("%s\n", "Sunt direct proportionale!");
  106. else
  107. printf("%s\n", "Nu sunt direct proportionale!");
  108.  
  109. if(est_inv_prop) printf("%s\n", "Sunt invers proportionale!");
  110. else
  111. printf("%s\n", "Nu sunt invers proportionale!");
  112.  
  113. } else {
  114.  
  115. printf("%s\n", "Nu se poate face proportionalitatea!");
  116. }
  117.  
  118. return 0;
  119. }
  120.  
Success #stdin #stdout 0s 5592KB
stdin
2
4
5
0
4
5
6
0
stdout
Arr 1 ->
Arr 2 ->
Sunt direct proportionale!
Nu sunt invers proportionale!