fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // prototype
  6. void pp(char *, int , int );
  7. int searchMajority();
  8. void votesExchange( int );
  9.  
  10. char *matrix;
  11. int votes,
  12. candidates,
  13. *sum;
  14.  
  15. void pp(char *a, int x, int y)
  16. {
  17. int i,
  18. j;
  19.  
  20. for ( i = 1; i <= x; ++i) {
  21. for ( j = 1; j <= y; ++j) {
  22. putchar(*a++);
  23. }
  24. puts("");
  25. }
  26. }
  27.  
  28. int searchMajority()
  29. {
  30. int i;
  31. char *p = matrix;
  32.  
  33. // 機能1:
  34. // sumに集計結果をセットする 。
  35. for ( i = 0; i < candidates; ++i) {
  36. sum[i] = 0;
  37. }
  38. for ( i = 0; i < votes; ++i) {
  39. // printf("matrix %c\n", *p);
  40. sum[*p - '1']++;
  41. p += candidates;
  42. }
  43.  
  44. // for ( i = 0; i < candidates; ++i) {
  45. // printf("sum[%d] = %d\n", i, sum[i]);
  46. // }
  47.  
  48. // 機能2:
  49. // 過半数獲得候補者が有れば、候補者番号(1~candidates)を返す。
  50. // 過半数候補者が無ければ、0を返す。
  51. for (i = 0; i < candidates; ++i) {
  52. if (sum[i] > votes / 2) {
  53. return i;
  54. }
  55. }
  56. return 0;
  57. }
  58.  
  59. void votesExchange(int n)
  60. {
  61. char t,
  62. *p = matrix;
  63. int i,
  64. min = votes;
  65.  
  66. printf("%3d 回目の入替 -> ", n);
  67. for ( i = 1; i < candidates; ++i) {
  68. if ((min > sum[i]) && (sum[i])) {
  69. min = sum[i];
  70. }
  71. }
  72. printf("最小得票数 = %6d\n", min);
  73. for ( i = 0; i < votes; ++i) {
  74. if (sum[*p - '1'] == min) {
  75. // swap
  76. t = *p;
  77. *p = *(p + n);
  78. *(p + n) = t;
  79. }
  80. p += candidates;
  81. }
  82. }
  83.  
  84.  
  85. int main()
  86. {
  87. FILE *fp;
  88. char c,
  89. *p,
  90. buf[100],
  91. // s[100],
  92. fname[] = "c672-3.c.in";
  93. int i,
  94. n,/* 入替対象列 */
  95. max,/* 最大得票数 */
  96. majority = 0;/* 過半数を獲得した候補者番号 */
  97.  
  98. // 入力ファイルopen
  99. fp = fopen(fname, "r");
  100. if ( fp == NULL ) {
  101. printf( "%sファイルが開けません\n", fname );
  102. return -1;
  103. }
  104.  
  105. // 候補者数をファイルから読み込む
  106. fgets(buf, 100, fp);
  107. p = strchr(buf, '=');
  108. if (p == NULL) {
  109. printf("候補者数を読み込めません\n" );
  110. return -1;
  111. }
  112. candidates = atoi(p + 1);
  113.  
  114. // 投票者数をファイルから読み込む
  115. fgets(buf, 100, fp);
  116. p = strchr(buf, '=');
  117. if (p == NULL) {
  118. printf("投票者数を読み込めません\n" );
  119. return -1;
  120. }
  121. votes = atoi(p + 1);
  122.  
  123. // 集計エリア確保
  124. matrix = (char *)malloc(sizeof(char) * candidates * votes);
  125. sum = (int *)malloc(sizeof(int) * candidates);
  126.  
  127. // ファイルからデータ読込
  128. p = matrix;
  129. i = votes * candidates;
  130. while ((c = fgetc(fp)) != EOF) {
  131. if (c != '\n') {
  132. *p++ = c;
  133. if (--i == 0) {
  134. break;
  135. }
  136. }
  137. }
  138.  
  139. n = 1;
  140. majority = searchMajority();
  141. while (!majority && (n < candidates)) {
  142. votesExchange(n);
  143. majority = searchMajority();
  144. ++n;
  145. }
  146.  
  147. if (majority) { /* 入替による過半数が有った場合 */
  148. printf("majority = %d\n", majority);
  149. } else { /* 入替による過半数が無かった場合、最大得票数の候補を探す(複数の可能性あり) */
  150. max = sum[0];/* 最大得票数を探す */
  151. for (i = 0; i < candidates; ++i) {
  152. if (max < sum[i]) {
  153. max = sum[i];
  154. }
  155. }
  156. for (i = 0; i < candidates; ++i) { /* 最大得票数に一致する候補者番号を出力する */
  157. if (sum[i] == max) {
  158. printf("majority = %d\n", i);
  159. }
  160. }
  161. }
  162.  
  163. return 0;
  164. }
Runtime error #stdin #stdout 0.02s 1808KB
stdin
Standard input is empty
stdout
c672-3.c.inファイルが開けません