fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct FRACTION
  6. {
  7. int num;
  8. int den;
  9. };
  10.  
  11. bool haveCommonDigit(int num1, int num2)
  12. {
  13. int x1 = num1 % 10;
  14. int y1 = num1 / 10;
  15. int x2 = num2 % 10;
  16. int y2 = num2 / 10;
  17.  
  18. return (x1 == x2 || x1 == y2 || y1 == x2 || y1 == y2);
  19. }
  20.  
  21. bool arePalindromesOfEachOther(int num1, int num2)
  22. {
  23. int x1 = num1 % 10;
  24. int y1 = num1 / 10;
  25. int x2 = num2 % 10;
  26. int y2 = num2 / 10;
  27.  
  28. return (x1 == y2 && x2 == y1);
  29. }
  30.  
  31. int gcd(int num1, int num2)
  32. {
  33. if (num2 == 0)
  34. return num1;
  35. else
  36. return gcd(num2, num1 % num2);
  37. }
  38.  
  39. FRACTION cancelCommonDigits(int num1, int num2)
  40. {
  41. int x1 = num1 % 10;
  42. int y1 = num1 / 10;
  43. int x2 = num2 % 10;
  44. int y2 = num2 / 10;
  45.  
  46. int simple1 = num1;
  47. int simple2 = num2;
  48.  
  49. if (x1 == x2)
  50. {
  51. simple1 = num1 / 10;
  52. simple2 = num2 / 10;
  53. }
  54. else if (x1 == y2)
  55. {
  56. simple1 = num1 / 10;
  57. simple2 = num2 % 10;
  58. }
  59. else if (y1 == x2)
  60. {
  61. simple1 = num1 % 10;
  62. simple2 = num2 / 10;
  63. }
  64. else if (y1 == y2)
  65. {
  66. simple1 = num1 % 10;
  67. simple2 = num2 % 10;
  68. }
  69.  
  70. int common_divisor = gcd(num1, num2);
  71. int common_divisor_simple = gcd(simple1, simple2);
  72. if (num1 / common_divisor == simple1 / common_divisor_simple && num2 / common_divisor == simple2 / common_divisor_simple)
  73. {
  74. cout << num1 << "/" << num2 << " = " << simple1 << "/" << simple2 << endl;
  75.  
  76. FRACTION ret = {simple1, simple2};
  77. return ret;
  78. }
  79. else
  80. {
  81. FRACTION ret = {};
  82. return ret;
  83. }
  84. }
  85.  
  86. int main()
  87. {
  88. FRACTION fractions[4] = {};
  89. int fractions_index = 0;
  90.  
  91. for (int i = 11; i < 100; i++)
  92. {
  93. for (int j = 11; j < 100; j++)
  94. {
  95. /* can't be factors of 10
  96.   must be less than 1 in value
  97.   must have a common digit
  98.   can't be palindromes of each other (if we cancel just one digit, after simplifying we get 1, which isn't allowed)
  99.   */
  100. if ((i % 10 != 0 && j % 10 != 0) && (i % j > 0 && i / j == 0) && haveCommonDigit(i, j) && !arePalindromesOfEachOther(i, j))
  101. {
  102. FRACTION frac = cancelCommonDigits(i, j);
  103. if (frac.den != 0)
  104. {
  105. fractions[fractions_index] = frac;
  106. fractions_index++;
  107. }
  108. }
  109. }
  110. }
  111.  
  112. int numerator = 1;
  113. int denominator = 1;
  114. int common_divisor;
  115.  
  116. for (int i = 0; i < 4; i++)
  117. {
  118. numerator *= fractions[i].num;
  119. denominator *= fractions[i].den;
  120. }
  121.  
  122. common_divisor = gcd(numerator, denominator);
  123. cout << denominator / common_divisor;
  124.  
  125. return 0;
  126. }
  127.  
Success #stdin #stdout 0.02s 2724KB
stdin
Standard input is empty
stdout
16/64 = 1/4
19/95 = 1/5
26/65 = 2/5
49/98 = 4/8
100