fork download
  1. #include <iostream>
  2. #include <cstdint>
  3. #include <numeric>
  4. #include <limits>
  5. #include <algorithm>
  6.  
  7. //cant use for minus field.
  8. //std::gcd need C++17.
  9.  
  10. #define CONSTEXPR /**/constexpr/**/
  11.  
  12. class Fraction {
  13. protected:
  14. template<class T>
  15. CONSTEXPR T Abs(const T& In) const {
  16. return In > 0 ? In : -In;
  17. }
  18. template<class T>
  19. CONSTEXPR T Gcd(T A,T B) const {
  20. if (A < B) {
  21. T AA = A;
  22. A = B;
  23. B = AA;
  24. }
  25. T R = A%B;
  26. while (R) {
  27. A = B;
  28. B = R;
  29. R = A % B;
  30. }
  31. return B;
  32. }
  33. public:
  34. CONSTEXPR Fraction(){}
  35. CONSTEXPR Fraction(std::intmax_t N):Denominator(1),Numerator(N){}
  36. CONSTEXPR Fraction(std::intmax_t Bunnsi,std::uintmax_t Bunnbo):Numerator(Bunnsi),Denominator(Bunnbo){}
  37.  
  38. CONSTEXPR operator double() const {
  39. return (Numerator / (double)Denominator) ;
  40. }
  41. CONSTEXPR std::intmax_t& GetNumerator() {
  42. return Numerator;
  43. }
  44. CONSTEXPR std::intmax_t GetNumerator() const {
  45. return Numerator;
  46.  
  47. } std::uintmax_t& GetDenominator(){
  48. return Denominator;
  49. }
  50. CONSTEXPR std::uintmax_t GetDenominator() const {
  51. return Denominator;
  52. }
  53. CONSTEXPR bool Set(const std::intmax_t& N,const std::uintmax_t& D){
  54. Denominator = D;
  55. Numerator = N;
  56. return true;
  57.  
  58. }
  59. CONSTEXPR bool Denomi() {
  60. std::intmax_t D = Gcd<std::uintmax_t>(Abs(Numerator), Denominator);
  61.  
  62. while (D != 1) {
  63. Numerator /= D;
  64. Denominator /= D;
  65. D = Gcd<std::uintmax_t>(Abs(Numerator), Denominator);
  66. }
  67. return true;
  68. }
  69.  
  70. CONSTEXPR double ToDouble() const{
  71. return *this;
  72. }
  73. CONSTEXPR Fraction operator +(const Fraction& In)const {
  74. std::uintmax_t Mul= GetDenominator()* In.GetDenominator();
  75. Fraction A{static_cast<std::intmax_t>(GetNumerator() * (Mul/GetDenominator())),Mul};
  76. Fraction B{static_cast<std::intmax_t>(In.GetNumerator() * (Mul/In.GetDenominator())),Mul};
  77. Fraction T{ A.GetNumerator() + B.GetNumerator(),Mul };
  78. T.Denomi();
  79. return T;
  80.  
  81. }
  82. CONSTEXPR Fraction operator -(const Fraction& In)const {
  83. std::uintmax_t Mul= GetDenominator()* In.GetDenominator();
  84. Fraction A{static_cast<std::intmax_t>(GetNumerator() * (Mul/GetDenominator())),Mul};
  85. Fraction B{static_cast<std::intmax_t>(In.GetNumerator() * (Mul/In.GetDenominator())),Mul};
  86. Fraction T{ A.GetNumerator() - B.GetNumerator(),Mul };
  87. T.Denomi();
  88. return T;
  89. }
  90. CONSTEXPR Fraction operator *(const Fraction& In)const {
  91. Fraction T(GetNumerator() * In.GetNumerator(), GetDenominator() * In.GetDenominator());
  92. T.Denomi();
  93. return T;
  94.  
  95. }
  96.  
  97. CONSTEXPR Fraction operator /(const Fraction& In)const {
  98. int S = In.GetNumerator() > 0 ? 1 : -1;
  99. Fraction T(GetNumerator() * In.GetDenominator()*S,GetDenominator() * Abs(In.GetNumerator()));
  100.  
  101.  
  102. T.Denomi();
  103. return T;
  104.  
  105. }
  106.  
  107.  
  108. public:
  109.  
  110. protected:
  111. std::uintmax_t Denominator = 1;//分母
  112. std::intmax_t Numerator = 0;//分子
  113. };
  114.  
  115.  
  116. template<class Char>
  117. std::basic_ostream<Char>& operator <<(std::basic_ostream<Char>& os, const Fraction& F) {
  118. os << F.GetNumerator() << '/' << F.GetDenominator();
  119. return os;
  120. }
  121. /** /
  122. int main() {
  123.  
  124. constexpr std::size_t L = 100;
  125. for (std::uintmax_t i = 1; i < L; i++) {
  126. for (std::intmax_t j = 0; j < L; j++) {
  127. Fraction F(j, i);
  128. std::cout <<F<<'='<<static_cast<double>(F)<< std::endl;
  129. }
  130. }
  131.  
  132. return 0;
  133.  
  134. }
  135. /**/
  136. int main() {
  137. CONSTEXPR Fraction A = 10;
  138. CONSTEXPR Fraction AA = 100;
  139. CONSTEXPR Fraction B(-1, 10);
  140.  
  141. CONSTEXPR Fraction C = A + B;
  142. CONSTEXPR Fraction D = B - A;
  143. CONSTEXPR Fraction E = A * B;
  144. CONSTEXPR Fraction F = A / B;
  145.  
  146. CONSTEXPR Fraction CC = AA + A;
  147. CONSTEXPR Fraction DD = AA - A;
  148. CONSTEXPR Fraction EE = AA * A;
  149. CONSTEXPR Fraction FF = AA / A;
  150.  
  151. std::cout << C.GetNumerator() << '/' << C.GetDenominator() <<'='<<C<<'='<<static_cast<double>(C)<<std::endl;
  152. std::cout << D.GetNumerator() << '/' << D.GetDenominator() <<'='<<D<<'='<<static_cast<double>(D)<<std::endl;
  153. std::cout << E.GetNumerator() << '/' << E.GetDenominator() <<'='<<E<<'='<<static_cast<double>(E)<<std::endl;
  154. std::cout << F.GetNumerator() << '/' << F.GetDenominator() <<'='<<F<<'='<<static_cast<double>(F)<<std::endl;
  155.  
  156. std::cout << CC.GetNumerator() << '/' << CC.GetDenominator() <<'='<<CC<< std::endl;
  157. std::cout << DD.GetNumerator() << '/' << DD.GetDenominator() <<'='<<DD<< std::endl;
  158. std::cout << EE.GetNumerator() << '/' << EE.GetDenominator() <<'='<<EE<< std::endl;
  159. std::cout << FF.GetNumerator() << '/' << FF.GetDenominator() <<'='<<FF<< std::endl;
  160. return 0;
  161. }
  162. /**/
Success #stdin #stdout 0s 4436KB
stdin
Standard input is empty
stdout
99/10=99/10=9.9
-101/10=-101/10=-10.1
-1/1=-1/1=-1
-100/1=-100/1=-100
110/1=110/1
90/1=90/1
1000/1=1000/1
10/1=10/1