如何找出素数出现的次数?

时间:2014-02-01 00:52:45

标签: c prime-factoring

我需要编写一个程序来输入一个数字,并以C

的形式输出它的阶乘
4!=(2^3)*(3^1)

5!=(2^3)*(3^1)*(5^1)

我能够找到素数2,3和5,但我如何计算它们出现的次数? (^3, ^1, ^1)

代码:

int main() {
    int num,i,count,n;
    printf("Enter to find prime numbers: ");
    scanf("%d",&n);

    for(num = 2; num<=n;num++) {
        count = 0;

        for(i=2;i<=num/2;i++) {
            if(num%i==0)
            {
                count++;
                break;
            }
        }

        if(count==0 && num!= 1)
            printf("%d ",num);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:2)

不进入任何代码,我会解释你做事的方式有什么问题......

让我们说你想找到5的阶乘的素因子。所以你这样做:

5! = 2 x 3 x 4 x 5(这是你的外环(for(num = ...)

让我们说一下特定的迭代,num = 4。然后,您在i中进行了另一次迭代,检查每个数字num/2是一个因素。现在为5的小值!这不是问题。考虑更大的数字,如25!在这种情况下,您的外部循环将是:

25! = 1 x 2 x 3 x ... 22 x 23 x 24 x 25

现在你的外部迭代num更进一步。现在考虑数字24. 24/2 = 12.你的程序将打印所有因子,将24分为12,恰好是2,3,4,6和12.我是当然,这不是你想要的。

首先,尝试查找大数的阶乘。您将遇到溢出问题。接下来,我给你一些指示,并希望你可以自己解决问题。这是一个非常酷的问题,所以我真的希望你能解决它:

  1. 研究主筛算法(http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)。你直接使用它,但只有这里提到的想法。
  2. 创建两个数组。第一个将包含素数因子,而下一个将包含因子中出现的因子的总数。
  3. 对于特定的num,您需要迭代不使用已使用的i但使用素数组中的值。 3.1。使用 Barmar 解释的方法查找此num可被因子整除的次数,并更新计数数组中的相应计数。
  4. 打印出您获得的因素和计数。
  5. 最后,我认为这是一个非常好的问题。它教你如何不遇到溢出错误,仍然能够使用计算机解决问题。它可以教你动态内存分配和内存管理技能,如果这是你想要的方式。它还可以帮助您批判性地思考问题。你不值得-1。我提高了你的评价。

    进行有趣的编程,并对程序中的每个setp进行批判性思考。

    干杯!

答案 1 :(得分:0)

for(num = 2; num<=n; ++num){
    count = 0;

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

    if(count!=0)
        printf("(%d^%d)", num, count);
}