fork(1) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #include <locale.h>
  5.  
  6. int* generate(int n);
  7. void show(int* a, int n);
  8. void kill(int *a, int n, int i);
  9. void circle(int *a, int n, int k, int i);
  10.  
  11. int main() {
  12. int n = 10, k = 2, *a = NULL;
  13. a = generate(n);
  14. show(a, n);
  15. circle(a, n, k, 0);
  16. }
  17.  
  18. // здесь храним номера всех живущих на данный момент воинов
  19. int* generate(int n)
  20. {
  21. int* a;
  22. int i;
  23. a = (int*)malloc(n*sizeof(int));
  24. if (a == NULL)
  25. return NULL;
  26. for (i = 0; i < n; i++) {
  27. *(a + i) = i + 1;
  28. }
  29. return a;
  30. }
  31.  
  32. void show(int *a, int n) {
  33. int i;
  34. setlocale(LC_ALL, "Russian");
  35. printf("Участвует воинов: %d \n", n);
  36. for (i = 0; i < n; i++) {
  37. printf("%d ", *(a + i));
  38. }
  39. printf("\n");
  40. }
  41.  
  42. // воин умирает - удаляем его из массива, а тех, кто стоял за ним, сдвигаем на один элемент влево
  43. void kill(int *a, int n, int i) {
  44. int j;
  45. for (j = i; j < n - 1; j++)
  46. *(a + j) = *(a + j + 1);
  47. }
  48.  
  49. void circle(int *a, int n, int k, int i) {
  50. int ii;
  51. if (n > k) {
  52. ii = i + k - 1;
  53. if (ii >= n) {
  54. ii = ii % n;
  55. }
  56. kill(a, n, ii);
  57. circle(a, n - 1, k, ii);
  58. }
  59. printf("Оставшиеся в живых: %d \n", n);
  60. for (i = 0; i < k; i++) {
  61. printf("%d ", *(a + i));
  62. }
  63. free(*a);
  64. printf("\n");
  65. }
Runtime error #stdin #stdout 0s 2300KB
stdin
Standard input is empty
stdout
Standard output is empty