我目前正致力于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
答案 0 :(得分:1)
我会向你提出以下建议:在处理理性时忘记找到有素数列表的最大公约数。这就是我们在学校所教的内容,但是使用Euclid's algorithm
可以更轻松(更有效地)解决这项任务的编程工作答案 1 :(得分:0)
我不明白你为什么只在[1,10000]范围内寻找素数而你分解的数字可以达到(10 ^ 9)^ 2 = 10 ^ 18 但正如Marom所说,你应该使用gdc算法。
此外,我不明白你为什么要在你的函数中传递指向int的指针(add,divi ......)。
此外,在此代码中:
long long top = (*x1) * (*x2);
我认为如果x1和x2太大会发生溢出,因为转换发生在整数相乘之后(而不是long long int)。