我目前正在研究https://open.kattis.com/problems/rationalarithmetic以进行自己的练习。我得到 4 位数字和一个操作。输入是:x1 y1 op x2 y2,分数是 x1/y1 和 x2/y2。如果我得到输入:1 3 + 1 2 那么它的 1/3 + 1/2 并且答案应该是最小的分形,所以它的 5/6。我通过了我得到的测试用例,但我不知道我做错了什么。总结一下我的做法:
- 读取输入并检查操作是否为 +、-、/ 或 *。我生成一个素数数组来找到最大公约数。
- 根据输入的操作将输入发送到函数。
- 我用简单的数学计算给定的输入。
- 然后我找到最大的公约数并将分子和分母都除以它。
- 之后我打印出结果。
这是主要功能以及如果操作是 *. 我以相同的方式处理其他操作,但使用其他数学。
void mult(int *x1, int *y1, int *x2, int *y2){
long long top = (*x1) * (*x2);
long long bottom = (*y2) * (*y1);
long long frac;
if(bottom != 0||top != 0){
frac = commonDiv(top,bottom);
}else{
frac = 1;
}
string sign = "";
if(top * bottom < 0){
sign = "-";
}else{
sign = "";
}
printf("%s%lld / %lld\n",sign.c_str(),abs(top/frac),abs(bottom/frac) );
}
int main()
{
int numOp;
scanf("%d", &numOp);
getPrime(1,sqrt(100000));
while(numOp != 0){
int x1,x2,y1,y2;
char op[2];
scanf("%d %d %s %d %d", &x1, &y1, op, &x2, &y2);
if( op[0] == '+'){
add(&x1, &y1, &x2,&y2);
}
else if(op[0] == '-'){
sub(&x1,&y1,&x2,&y2);
}
else if(op[0] == '/'){
divi(&x1,&y1,&x2,&y2);
}
else{
mult(&x1,&y1,&x2,&y2);
}
numOp--;
}
}
这是给定测试用例的代码,我得到了正确的结果。我需要一些关于不同测试用例或任何建议的提示。 http://ideone.com/jBddSI