1.vs2013不能用scanf,改为scanf_s,但是提交时不能用scanf_s,用scanf。。。
1 scanf_s("%lld/%lld %lld/%lld", &a[0], &a[1], &b[0], &b[1]);
2.c++中数组作为函数参数时传递的是地址,会改变实参的值。
3.用printf输出string型变量时要加上“.c_str()”:
1 printf("%s + %s = %s ", simple(a).c_str(), simple(b).c_str(), simple(r).c_str());
4.类型别名:
1 using LL = long long;
相乘时可能会超出整型范围,用long long。
代码:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 using LL = long long;//类型别名 5 6 LL gcd(LL a, LL b) 7 { 8 if (b == 0) 9 return a; 10 return gcd(b, a % b); 11 } 12 13 string simple(LL a[2]) 14 { 15 LL m = a[0], n = a[1]; 16 if (n < 0) 17 { 18 m = -m; 19 n = -n; 20 } 21 string s; 22 char c; 23 if (m < 0) 24 { 25 m = -m; 26 c = '-'; 27 } 28 else c = '+'; 29 30 LL g = gcd(m, n);//分子分母最大公约数 31 m = m / g; 32 n = n / g; 33 34 LL r = m % n; 35 LL k = m / n; 36 if (k) s = to_string(k); 37 if (r && k) s += " "; 38 if (r) s = s + to_string(r) + "/" + to_string(n); 39 if (!k && !r) s = "0"; 40 41 if (c == '-') s = "(-" + s + ")"; 42 return s; 43 } 44 void add(LL a[2], LL b[2]) 45 { 46 LL r[2]; 47 r[0] = a[0] * b[1] + b[0] * a[1]; 48 r[1] = a[1] * b[1]; 49 printf("%s + %s = %s ", simple(a).c_str(), simple(b).c_str(), simple(r).c_str()); 50 } 51 void sub(LL a[2], LL b[2]) 52 { 53 LL r[2]; 54 r[0] = a[0] * b[1] - b[0] * a[1]; 55 r[1] = a[1] * b[1]; 56 printf("%s - %s = %s ", simple(a).c_str(), simple(b).c_str(), simple(r).c_str()); 57 } 58 void motify(LL a[2], LL b[2]) 59 { 60 LL r[2]; 61 r[0] = a[0] * b[0]; 62 r[1] = a[1] * b[1]; 63 printf("%s * %s = %s ", simple(a).c_str(), simple(b).c_str(), simple(r).c_str()); 64 } 65 void divide(LL a[2], LL b[2]) 66 { 67 LL r[2]; 68 r[0] = a[0] * b[1]; 69 r[1] = a[1] * b[0]; 70 if (r[1]) 71 printf("%s / %s = %s ", simple(a).c_str(), simple(b).c_str(), simple(r).c_str()); 72 else 73 printf("%s / %s = Inf ", simple(a).c_str(), simple(b).c_str()); 74 } 75 int main() 76 { 77 LL a[2], b[2]; 78 scanf_s("%lld/%lld %lld/%lld", &a[0], &a[1], &b[0], &b[1]); 79 80 add(a, b); 81 sub(a, b); 82 motify(a, b); 83 divide(a, b); 84 85 return 0; 86 }