使用平方根的偶数除数

Number of even divisors using square root

本文关键字:平方根      更新时间:2023-10-16

我正在解决一个问题,它需要得到偶数和奇数除数之间的差,我需要使用sqrt()函数,因为数字的限制是10^9,所以在整个数字上循环不是一个选项,因为超过了时间限制。

这是我试着做的一个函数,但它并不能完全适用于所有数字。

Ex。4&48745.

情况4:应输出2个偶数除数{2,4}和1个奇数除数{1}——下面的函数输出3个偶数1个奇数

案例48745:应输出0个偶数除数和4个奇数除数{1,5974948745}——下面的函数输出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;
}

尝试更简单的代码:

#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;
}