簡體   English   中英

C中階乘的素數分解

[英]prime factorization of factorial in C

我正在嘗試編寫一個程序,它將以以下形式打印給定數字的階乘: 10!=2^8 * 3^4 * 5^2 * 7 為了使其快速,假設給定數字是 10,我們事先有素數。 我不想先計算階乘。 因為如果給定的數字更大,它最終會超出 int 類型的范圍。 所以我遵循的算法是:首先計算二的冪。 一到十之間有五個數字,二分為五。 這些數字分別為 2*1、2*2、...、2*5。 此外,二也將集合 {1,2,3,4,5} 中的兩個數相除。 這些數字是 2*1 和 2*2。 繼續這種模式,二分為一和二之間的一個數。 那么a=5+2+1=8。

現在看看找到三的力量。 有從一到十的三個數字,三分為三,然后是一到三之間的一個數字,三分為一。 因此b=3+1=4。 以類似的方式 c=2。 那么集合 R={8,4,2,1}。 最后的答案是:

10!=2^8*3^4*5^2*7

所以我寫的是:

#include <stdio.h>
main()
 {
     int i, n, count;
     int ara[]={2, 3, 5, 7};
     for(i=0; i<4; i++)
     {
         count=0;
         for(n=10; n>0; n--)
         {
            while(n%ara[i]==0)
            {
                count++;
                n=n/ara[i];
            }
         }
         printf("(%d^%d)" , ara[i], count);
     }
     return 0;
   }

輸出為 (2^3) (3^2) (5^1) (7^1)。 我不明白我的代碼有什么問題。 任何人都可以幫助我嗎?

更簡單的方法:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    const int n = 10;
    const int primes[] = {2,3,5,7};
    for(int i = 0; i < 4; i++){
        int cur = primes[i];
        int total = 0;
        while(cur <= n){
            total += (n/cur);
            cur = cur*primes[i];
        }
        printf("(%d^%d)\n", primes[i], total);
    }
    return 0;
}

當您的代碼可被某個素數整除時,您的代碼會除以 n,從而進行 n 次跳躍。

例如,當 n = 10 且 i = 0 時,您進入 while 循環,n 可被 2 整除 (arr[0]),導致 n = 5。因此您跳過了 n = [9..5)

你應該做的是你應該在划分時使用 temp ,如下所示:

#include <stdio.h>
main()
 {
 int i, n, count;
 int ara[]={2, 3, 5, 7};
 for(i=0; i<4; i++)
 {
     count=0;
     for(n=10; n>0; n--)
     {
        int temp = n;
        while(temp%ara[i]==0)
        {
            count++;
            temp=temp/ara[i];
        }
     }
     printf("(%d^%d)" , ara[i], count);
 }
 return 0;

}

用於查找無 pl 的階乘。 試試這個代碼:

#include <stdio.h>

int main()
{
  int c, n, fact = 1;

  printf("Enter a number to calculate it's factorial\n");
  scanf("%d", &n);

  for (c = 1; c <= n; c++)
    fact = fact * c;

  printf("Factorial of %d = %d\n", n, fact);

  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM