如何分解数字?

时间:2016-11-02 12:04:16

标签: c math

我被要求对一个数字进行分解并以特定的方式显示它。

例如:100 = 2 ^ 2 * 5 ^ 2

这是我到目前为止使用的C ++代码,不幸的是:

#include <stdio.h>
#include <math.h> 

//IsPrime indicates whether a given number is or is not prime.
bool IsPrime(long long n)
{   
    int j = 3;
    if (n == 2)
    {
        return true;
    }
    else if (n % 2 == 0)
    {
        return false;
    }
    else
    {
        for (j = 3; j <= sqrt(n); j += 2)
        {
            if (n%j == 0)
            {
                return false;
            }
        }
    }
    return true;
}

int main(void)
{
    long long n_orig,n, i=3 , primecount=0;
    scanf("%lld", &n_orig);
    n = n_orig;
    if (n == 1)
    {
        printf("1");
        return 0;
    }
    if (IsPrime(n))
    {
        printf("%lld", n);
        return 0;
    }
    if (n % 2 == 0)
    {
        while (n >= 2 && n % 2 == 0)
        {
            primecount++;
            n = n / 2;
        }
        if (primecount == 1)
        {
            printf("2*");
        }
        else
        {
            printf("2^%lld*", primecount);
        }
    }
    primecount = 0;
    n = n_orig;
    while (i <= n/2)
    {
        if (IsPrime(i))
        {
            while (n >= i && n % i == 0)
            {
                primecount++;
                n = n / i;
            }
        }
        n = n_orig;
        if (primecount == 0)
        {
            i++;
            continue;
        }
        if (primecount == 1)
        {
            printf("%lld*", i);
        }
        else
        {
            printf("%lld^%lld*", i, primecount);
        }
        primecount = 0;
        i+=2;
    }
    printf("\b");
    return 0;
}

使用此代码,我能够生成一些测试用例,但是当我将答案上传到可能评估代码的网站时,在7个测试用例中(我不知道它们到底是什么),在一个案例中,我通过了3 ,失败3 超过了时间限制(在问题中没有宣布的那个)。我真的很感激一些帮助,请对诺贝尔友好!

另外,我真的不想知道我的答案是否可以通过某种方式得到改善,我现在的首要任务就是理解为什么我自己的代码没有按预期工作。

P.S:不允许使用 iostream 数组

提前致谢。

3 个答案:

答案 0 :(得分:1)

试试这个:

#include <stdio.h>
#include <math.h>

unsigned long long PrintMultiplicity(unsigned long long n,unsigned long long factor)
{
    unsigned int count = 0;

    while (n%factor == 0)
    {
        count++;
        n /= factor;
    }

    if (count > 0)
    {
        printf("%llu^%u",factor,count);
        if (n > 1)
            printf("*");
    }

    return n;
}

void PrintFactorization(unsigned long long n)
{
    unsigned long long factor;
    unsigned int add;

    printf("%llu = ",n);

    n = PrintMultiplicity(n,2);
    n = PrintMultiplicity(n,3);

    // Check only factors that are adjacent to multiples of 6
    for (factor = 5, add = 2; factor <= sqrt(n); factor += add, add = 6-add)
        n = PrintMultiplicity(n,factor);

    if (n > 1)
        printf("%llu^1",n);

    printf("\n");
}

int main()
{
    unsigned long long n;
    scanf("%llu",&n);
    PrintFactorization(n);
    return 0;
}

答案 1 :(得分:0)

您需要执行一些优化的优化。不要为每个值调用isPrime()方法,而是考虑一种不同的方法,以便在一开始就可以完全忽略不相关的值。

  1. 使用Sieve of Eratosthenes概念获取n下的相关素数列表。
  2. 从列表中的最低素​​数值开始,将n除以中间值

    n / lowest_prime_that_perfectly_divide_n

    通过检查下一个更高的素数值继续执行此操作,直到n变为1。这样,每个分割因子都会计算

答案 2 :(得分:0)

您不需要进行主要测试,只有加速才需要素数或主轮列表。列出所有主要因素的简单程序是

#include <stdio.h>
#include <math.h> 

int main(void)
{
    long long n_orig,n,k;
    scanf("%lld", &n_orig);
    n = n_orig;
    k=2;
    while(k*k<=n) {
        while(0==n%k) {
            n = n/k;
            printf("%lld ",k);
        }
        k++;
    }
    if(n>1) printf("%lld ",n);
    printf("\n");
    return 0;
}

这不会生成所需的输出格式,但可以轻松添加到其中。