Количество четных делителей, использующих квадратный корень

Я решаю проблему, где нужно получить разницу между количеством четных и нечетных делителей, и мне нужно использовать функцию sqrt (), потому что предел числа составляет 10 ^ 9, поэтому цикл по целому числу не является Опция причина превышения срока.

эту функцию я пытался сделать, но она не работает идеально на всех номерах.

Ex. 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;
}

0

Решение

Попробуйте более простой код:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]