fork download
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. import java.util.Scanner;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7.  
  8. class Ideone
  9. {
  10. public static void main(String[] args)
  11. {
  12. ArrayList<Fraction> list = new ArrayList<Fraction>();
  13. try (Scanner in = new Scanner(System.in))
  14. {
  15. while (in.hasNextLine())
  16. {
  17. String line = in.nextLine();
  18. try
  19. {
  20. list.add(new Fraction(line));
  21. System.out.printf("I> %s%n", line);
  22. Collections.sort(list);
  23.  
  24. // 入力された分数を記録して昇順ソート後に出力。
  25. {
  26. System.out.print("O> ");
  27. for (Fraction f : list)
  28. {
  29. System.out.print(f.s + " ");
  30. }
  31. System.out.println();
  32. }
  33.  
  34. // 等しい値をグループ化して出力。
  35. {
  36. System.out.print("O> ");
  37. ArrayList<Fraction> group = new ArrayList<Fraction>();
  38. Fraction a = list.get(0);
  39. group.add(a);
  40. for (int i = 1; i < list.size(); i++)
  41. {
  42. Fraction b = list.get(i);
  43. if (a.compareTo(b) == 0)
  44. {
  45. group.add(b);
  46. }
  47. else
  48. {
  49. printGroup(group);
  50. group.clear();
  51. group.add(b);
  52. a = b;
  53. }
  54. }
  55. printGroup(group);
  56. System.out.println();
  57. }
  58.  
  59. // 仮分数(2/2, 3/2等)の入力を帯分数または整数に変換してから出力。
  60. {
  61. System.out.print("O> ");
  62. Fraction a = list.get(0);
  63. for (int i = 1; i < list.size(); i++)
  64. {
  65. Fraction b = list.get(i);
  66. if (a.compareTo(b) != 0)
  67. {
  68. System.out.print(a.n + " ");
  69. a = b;
  70. }
  71. }
  72. System.out.println(a.n);
  73. }
  74.  
  75. {
  76. System.out.println("不正な入力: " + e.getMessage());
  77. }
  78. }
  79. }
  80. }
  81.  
  82. static void printGroup(List<Fraction> group)
  83. {
  84. StringBuilder sb = new StringBuilder();
  85. if (group.size() == 1)
  86. {
  87. sb.append(group.get(0).s);
  88. sb.append(" ");
  89. }
  90. else
  91. {
  92. sb.append("(");
  93. for (Fraction f : group)
  94. {
  95. sb.append(f.s);
  96. sb.append(" ");
  97. }
  98. sb.setLength(sb.length() - 1);
  99. sb.append(") ");
  100. }
  101. System.out.print(sb);
  102. }
  103.  
  104.  
  105. }
  106.  
  107. class Fraction implements Comparable<Fraction>
  108. {
  109. static Pattern pattern = Pattern.compile("(\\d+)|(\\d+)/(\\d+)|(\\d+) (\\d+)/(\\d+)");
  110. int numerator;
  111. int denominator;
  112.  
  113. String s;
  114. String n;
  115.  
  116. Fraction(String s)
  117. {
  118. Matcher m = pattern.matcher(s);
  119. if (m.matches())
  120. {
  121. this.s = String.format("'%s'", s);
  122. if (m.group(1) != null) // 整数
  123. {
  124. numerator = Integer.parseInt(m.group(1));
  125. denominator = 1;
  126. }
  127. else if (m.group(2) != null) // 分数
  128. {
  129. numerator = Integer.parseInt(m.group(2));
  130. denominator = Integer.parseInt(m.group(3));
  131. }
  132. else if (m.group(4) != null) // 帯分数
  133. {
  134. denominator = Integer.parseInt(m.group(6));
  135. numerator = Integer.parseInt(m.group(4)) * denominator + Integer.parseInt(m.group(5));
  136. }
  137. }
  138.  
  139. if (denominator != 0)
  140. {
  141. int gcd = gcd(numerator, denominator);
  142. numerator /= gcd;
  143. denominator /= gcd;
  144.  
  145. if (numerator == 0)
  146. {
  147. n = "'0'";
  148. }
  149. else if (denominator == 1)
  150. {
  151. n = String.format("'%d'", numerator);
  152. }
  153. else if (numerator < denominator)
  154. {
  155. n = String.format("'%d/%d'", numerator, denominator);
  156. }
  157. else
  158. {
  159. n = String.format("'%d %d/%d'", numerator / denominator, numerator % denominator, denominator);
  160. }
  161. }
  162. else
  163. {
  164. }
  165. }
  166.  
  167. int gcd(int a, int b)
  168. {
  169. return b == 0 ? a : gcd(b, a % b);
  170. }
  171.  
  172. @Override
  173. public int compareTo(Fraction f)
  174. {
  175. return Long.compare((long) numerator * f.denominator, (long) f.numerator * denominator);
  176. }
  177. }
Success #stdin #stdout 0.16s 321088KB
stdin
1/2
1/3
2/3
1 1/3
2/4
2/2
3/2
4/2
2/8
9/6
stdout
I> 1/2
O> '1/2' 
O> '1/2' 
O> '1/2'
I> 1/3
O> '1/3' '1/2' 
O> '1/3' '1/2' 
O> '1/3' '1/2'
I> 2/3
O> '1/3' '1/2' '2/3' 
O> '1/3' '1/2' '2/3' 
O> '1/3' '1/2' '2/3'
I> 1 1/3
O> '1/3' '1/2' '2/3' '1 1/3' 
O> '1/3' '1/2' '2/3' '1 1/3' 
O> '1/3' '1/2' '2/3' '1 1/3'
I> 2/4
O> '1/3' '1/2' '2/4' '2/3' '1 1/3' 
O> '1/3' ('1/2' '2/4') '2/3' '1 1/3' 
O> '1/3' '1/2' '2/3' '1 1/3'
I> 2/2
O> '1/3' '1/2' '2/4' '2/3' '2/2' '1 1/3' 
O> '1/3' ('1/2' '2/4') '2/3' '2/2' '1 1/3' 
O> '1/3' '1/2' '2/3' '1' '1 1/3'
I> 3/2
O> '1/3' '1/2' '2/4' '2/3' '2/2' '1 1/3' '3/2' 
O> '1/3' ('1/2' '2/4') '2/3' '2/2' '1 1/3' '3/2' 
O> '1/3' '1/2' '2/3' '1' '1 1/3' '1 1/2'
I> 4/2
O> '1/3' '1/2' '2/4' '2/3' '2/2' '1 1/3' '3/2' '4/2' 
O> '1/3' ('1/2' '2/4') '2/3' '2/2' '1 1/3' '3/2' '4/2' 
O> '1/3' '1/2' '2/3' '1' '1 1/3' '1 1/2' '2'
I> 2/8
O> '2/8' '1/3' '1/2' '2/4' '2/3' '2/2' '1 1/3' '3/2' '4/2' 
O> '2/8' '1/3' ('1/2' '2/4') '2/3' '2/2' '1 1/3' '3/2' '4/2' 
O> '1/4' '1/3' '1/2' '2/3' '1' '1 1/3' '1 1/2' '2'
I> 9/6
O> '2/8' '1/3' '1/2' '2/4' '2/3' '2/2' '1 1/3' '3/2' '9/6' '4/2' 
O> '2/8' '1/3' ('1/2' '2/4') '2/3' '2/2' '1 1/3' ('3/2' '9/6') '4/2' 
O> '1/4' '1/3' '1/2' '2/3' '1' '1 1/3' '1 1/2' '2'