[英]Number of even divisors using square root
我正在解決一個需要獲得偶數和奇數除數之間的差的問題,並且我需要使用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;
}
嘗試更簡單的代碼:
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.