fork download
  1. #include <iostream>
  2. int pack_null_i(int* arr, int num);
  3. int* pack_null_p(int* fa, int* la);
  4.  
  5.  
  6. int main(void){
  7. int a[] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 };
  8. int n = sizeof(a)/sizeof(a[0]);
  9.  
  10. n = pack_null_i(a, n);
  11. for(int i = 0; i < n; ++i)
  12. std::cout << a[i] << ' ';
  13. std::cout << std::endl;
  14.  
  15. //...
  16.  
  17. int b[] = { 0, 0, 0, 0, 1, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0 };
  18.  
  19. int* e = pack_null_p(b, b + sizeof(b)/sizeof(b[0]));
  20. for(const int* p = &b[0]; p != e; ++p)
  21. std::cout << *p << ' ';
  22. return 0;
  23. }
  24.  
  25. //индексный вариант
  26. int pack_null_i(int* arr, int num){
  27. int a, b, i, k, m = num;
  28.  
  29. for(a = 0; a < (num - 1); ++a){
  30. if((arr[a] == 0) && (arr[a + 1] == 0))
  31. break;
  32. }
  33. for(b = a; b < num; arr[b] = arr[a]){
  34. if(arr[a] == 0){
  35. i = a;
  36. while((i < m) && (arr[i] == 0))
  37. ++i;
  38.  
  39. k = i - a;
  40. if(k > 1){
  41. arr[++b] = k;
  42. b += 1;
  43. a = i;
  44. num -= k - 2;
  45. continue;
  46. }
  47. }
  48. ++b;
  49. ++a;
  50. }
  51. return num;
  52. }
  53.  
  54. //вариант на указателях
  55. int* pack_null_p(int* fa, int* la){
  56. int* a, *b, *p, k, *e = la;
  57.  
  58. for(a = fa; a < (la - 1); ++a){
  59. if((*a == 0) && (*(a + 1) == 0))
  60. break;
  61. }
  62. for(b = a; b != la; *b = *a){
  63. if(*a == 0){
  64. p = a;
  65. while((p != e) && (*p == 0))
  66. ++p;
  67.  
  68. k = (int)(p - a);
  69. if(k > 1){
  70. *(++b) = k;
  71. b += 1;
  72. a = p;
  73. la -= k - 2;
  74. continue;
  75. }
  76. }
  77. ++b;
  78. ++a;
  79. }
  80. return la;
  81. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
0 7 1 0 7 
0 4 1 0 3 9 0 6