给定输入的有理数运算
rational arithmetic from given input
我目前正在为自己的实践https://open.kattis.com/problems/rationalarithmetic工作。我得到4位数字和一个运算。输入是x1 y1和x2 y2分数是x1/y1和x2/y2。如果我得到输入:1 3 + 1 2,那么它是1/3 + 1/2答案应该是最小分形,所以是5/6。我通过了我得到的测试用例,但我不知道我做错了什么。总结我的工作:
- 读取输入,如果是+、-、/或*,检查操作。我生成一个素数数组来找到最大的公约数。
- 根据操作将输入发送给函数
- 我用简单的数学计算给定输入。
- 然后我找到最大的公约数,并除以分子和分母。
- 之后,我在结果中打印出来。
下面是main函数和我如何处理如果操作是*。我用相同的方法处理其他操作,但使用了其他数学方法。
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 / %lldn",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但是正如Marom所说,你应该使用gdc算法。
此外,我不明白你为什么在你的函数(add,divi…)中传递指针给int。
同样,在这段代码中:
long long top = (*x1) * (*x2);
我认为如果x1和x2太大就会发生溢出,因为强制转换发生在整数乘法之后(而不是long long int)。
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- GCC本机矩阵运算库
- 位阵列上的快速AND运算
- 字符串中int的加法运算
- 算术运算的结果类似于:C浮点变量中的1/3
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?
- 如何在 vtk Poly 数据上进行布尔运算?
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 避免指针运算,修复叮当整齐错误
- 使用双精度的浮点运算
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 更快的C++算术运算
- 是否存在用于 C 或 C++ 中常见数学运算(例如最小值、最大值和平均值)的可导入库?
- 为什么循环体中的一个基本算术运算执行得比两个算术运算慢
- 两个字符串之间的数学运算
- 为什么对无符号字符进行算术运算会将它们提升为有符号整数
- 何时使用按位运算而不是算术替代方法?
- Arduino 上数学运算的计时速度 - 异常
- 给定输入的有理数运算