比赛 |
202110省实验桐柏一中普及组联赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
分数约分 |
最终得分 |
100 |
用户昵称 |
111 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2021-10-20 18:16:12 |
显示代码纯文本
#define MAXN 1000
#include <cstdio>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
using namespace std;
inline int max(int a,int b) {return a > b ? a : b;}
struct bign{
int len,a[MAXN + 1];
bign () {memset(a,0,sizeof(a)),len = 1;}
bign (int num){
char s[MAXN + 1];
sprintf(s,"%d",num);
*this = s;
}
bign (char * num){
if (num[0] == '0'){
len = 1,memset(a,0,sizeof(a));
}else{
for (int i = 0;num[i] == 48;num++) ;
len = strlen(num);
for (int i = 0;i < len;i++) a[i] = (num[len - i - 1] ^ 48);
}
}
bign operator = (int num){
char s[MAXN + 1];
sprintf(s,"%d",num);
*this = s;
return *this;
}
bign operator = (char * num){
if (num[0] == '0'){
len = 1,memset(a,0,sizeof(a));
}else{
for (int i = 0;num[i] == 48;num++) ;
len = strlen(num);
for (int i = 0;i < len;i++) a[i] = (num[len - i - 1] ^ 48);
}
return *this;
}
bign operator + (const bign & b){
bign ans;
ans.len = 0;
for (int i = 0,j = 0;j || i < max(len,b.len);i++){
if (i < len) j += a[i];
if (i < b.len) j += b.a[i];
ans.a[ans.len++] = j % 10;
j /= 10;
}
return ans;
}
bign operator += (bign & b) {return *this = *this + b;}
void clean(){
while (len > 1 && !a[len - 1]) --len;
if (len == 0) len = 1,a[0] = 0;
}
bign operator * (bign & b){
bign ans;
ans.len = len + b.len;
for (int i = 0;i < len;i++){
for (int j = 0;j < b.len;j++) ans.a[i + j] += a[i] * b.a[j];
}
for (int i = 0;i < ans.len;i++) ans.a[i + 1] += ans.a[i] / 10,ans.a[i] %= 10;
ans.clean();
return ans;
}
bign operator *= (bign & b) {return *this = (*this) * b;}
bign operator - (bign & b){//without negative result or numbers
bign ans;
ans.len = 0;
for (int i = 0,j = 0;i < len;i++){
int x = a[i] - j;
if (i < b.len) x -= b.a[i];
if (x >= 0) j = 0;
else j = 1,x += 10;
ans.a[ans.len++] = x;
}
ans.clean();
return ans;
}
bign operator -= (bign & b) {return *this = *this - b;}
bign operator / (bign & b){
bign ans,f,ten = 10;
for (int i = len - 1;i >= 0;i--){
f *= ten;
f.a[0] = a[i];
while (f >= b) f -= b,ans.a[i]++;
}
ans.len = len,ans.clean();
return ans;
}
bign operator /= (bign & b) {return *this = *this / b;}
bign operator % (bign & b){
bign t = *this / b * b;
t = *this - t;
t.clean();
return t;
}
bign operator %= (bign & b) {return *this = *this % b;}
bool operator < (bign & b){
if (len != b.len) return len < b.len;
for (int i = len - 1;i >= 0;i--){
if (a[i] != b.a[i]) return a[i] < b.a[i];
}
return 0;
}
bool operator > (bign & b){
if (len != b.len) return len > b.len;
for (int i = len - 1;i >= 0;i--){
if (a[i] != b.a[i]) return a[i] > b.a[i];
}
return 0;
}
bool operator == (bign & b){
if (len != b.len) return 0;
for (int i = len - 1;i >= 0;i--){
if (a[i] != b.a[i]) return 0;
}
return 1;
}
bool operator != (bign & b) {return !(*this == b);}
bool operator >= (bign & b) {return *this > b || *this == b;}
bool operator <= (bign & b) {return *this < b || *this == b;}
};
bign a,b,ten(10),zero(0);
inline void read(bign &t){
register char c = getchar();
while (c < 48 || c > 57) c = getchar();
while (c >= 48 && c <= 57) t = t * ten + bign(c ^ 48),c = getchar();
}
bign gcd(bign x,bign y){
if (y == zero) return x;
return gcd(y,x % y);
}
int main(){
freopen("yuefen.in","r",stdin);
freopen("yuefen.out","w",stdout);
zero.len = 1;read(a),read(b);
bign tmp = gcd(b,a);
a = a / tmp,b = b / tmp;
for (int i = a.len - 1;i >= 0;i--) printf("%d",a.a[i]);
putchar(' ');
for (int i = b.len - 1;i >= 0;i--) printf("%d",b.a[i]);
return 0;
}