【问题标题】:Number of even divisors using square root使用平方根的偶数除数
【发布时间】: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


【解决方案1】:

尝试更简单的代码:

#include <iostream>
#include <cmath>

int divdiff(int x)
{
    unsigned int even = 0;
    unsigned int odd  = 0;
    const unsigned int sqrtx = std::sqrt(x);

    for (int i = 1 ; i <= sqrtx ; ++i)
    {
        if (x % i == 0)
        {
            if (i % 2 == 0)
            {
                ++even;
            }
            else
            {
                ++odd;
            }
        }
    }

    even *= 2;
    odd  *= 2;

    if (x == sqrtx * sqrtx)
    {
        if (x % 2 == 0)
        {
            --even;
        }
        else
        {
            --odd;
        }
    }

    std::cerr << __func__ << '(' << x << "): even=" << even << ", odd=" << odd << std::endl;
    return even - odd;
}

int main()
{
    std::cout << divdiff(2*2) << std::endl;
    std::cout << divdiff(2*3) << std::endl;
    std::cout << divdiff(3*3) << std::endl;
    std::cout << divdiff(7*11*13*17*23) << std::endl;
}

【讨论】:

  • 只要 x 是正方形就错了。
猜你喜欢
  • 2014-06-24
  • 2015-03-04
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2018-06-17
相关资源
最近更新 更多