0

偶数と奇数の除数の数の差を取得する必要がある問題を解決しています。また、数の制限が 10^9 であるため、sqrt() 関数を使用する必要があるため、整数でループすることはできません。オプション 制限時間超過の原因。

これは私が作成しようとした関数ですが、すべての数値で完全に機能するわけではありません。

元。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;
}
4

1 に答える 1

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;
}
于 2015-12-17T11:21:22.560 に答える