【发布时间】:2015-12-17 10:11:40
【问题描述】:
我正在解决一个问题,它需要得到偶数和奇数除数之间的差异,我需要使用 sqrt() 函数,因为数字的限制是 10^9,所以循环整数不是超过时间限制的选项原因。
这是我尝试创建的一个函数,但它不能在所有数字上完美运行。
例如。 4 和 48745。
案例4:应该输出2个偶数除数{2,4}和1个奇数除数{1}——下面的函数输出3偶数1奇数
案例 48745:应该输出 0 个偶数除数和 4 个奇数除数 {1,5,9749,48745}——下面的函数输出 2 个偶数 2 个奇数
int di(int x)
{
int even=0,odd=0;
for(int i=1;i<=sqrt(x);i++)
{
if(x%i==0)
{
if(i%2)
odd++;
else
even++;
if(x/i %2==0 && x/i!=i)
even++;
else if(x/i!=i)
odd++;
}
}
return even-odd;
}
【问题讨论】:
-
它不能在所有数字上完美运行 作为诊断没有多大帮助。如果你报告了一些试验输入,你期望的输出和你得到的输出,那会更有帮助。您的程序所犯的错误类型是一个非常有用的诊断工具。哎呀,你甚至可以自己弄清楚......
-
您知道
sqrt接受一个浮点参数,更重要的是返回一个浮点值。浮点值在计算机上存在各种舍入问题,这意味着您可能无法完全得到您期望的结果,然后将其截断为整数以便在循环中进行比较.这意味着一个结果,例如1.9999566将被截断为1。 -
我认为检查奇数的偶数是奇数。
-
我不知道您在自己的代码中做了什么,但您提供的部分完美运行:ideone.com/lzkde2(即使不考虑这两个数字的
sqrt近似值)。跨度> -
这就是调试器的用途。在调试器中逐行执行代码,以查看每个计算的结果。对于像
4这样的小值,它非常简单快捷。
标签: c++ square-root time-limiting