[英]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.