Я сейчас работаю над https://open.kattis.com/problems/rationalarithmetic для собственной практики. Я получаю 4 цифры и операцию.
Ввод: x1 y1 op x2 y2, а дробная часть равна x1 / y1 и x2 / y2. Если я получу вход: 1 3 + 1 2, то его 1/3 + 1/2, и ответ должен быть дан минимальный fractial, поэтому его 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
Я бы сказал вам следующее: при работе с рациональными числами забудьте о поиске наибольших общих делителей со списком простых чисел. Это то, чему нас всех учили в школе, но при программировании эту задачу гораздо легче (и эффективнее) решить Алгоритм Евклида
Я не понимаю, почему вы ищете простые числа только в диапазоне [1 10000], в то время как числа, которые вы разлагаете, могут достигать (10 ^ 9) ^ 2 = 10 ^ 18
Но, как сказал Маром, вместо этого вы должны использовать алгоритм gdc.
Кроме того, я не понимаю, почему вы передаете указатели на int в своих функциях (add, divi …).
Также в этом коде:
long long top = (*x1) * (*x2);
Я думаю, что переполнение происходит, если x1 и x2 слишком велики, потому что приведение происходит после умножения целых чисел (а не long long int).