Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中阶乘的素分解_C_Algorithm - Fatal编程技术网

C中阶乘的素分解

C中阶乘的素分解,c,algorithm,C,Algorithm,我正试图编写一个程序,以如下形式打印给定数字的阶乘: 10!=2^8 * 3^4 * 5^2 * 7 为了让它快速,让我们假设给定的数字是10,我们事先有素数。我不想先计算阶乘。因为如果给定的数字更大,它最终将超出int类型的范围。所以我遵循的算法是: 首先计算2的幂。一到十之间有五个数字,二除以五。这些数字是2*1,2*2,…,2*5。此外,2还将集合{1,2,3,4,5}中的两个数相除。这些数字是2*1和2*2。继续这个模式,在一和二之间有一个数字,二分为二。然后a=5+2+1=8 现在看看

我正试图编写一个程序,以如下形式打印给定数字的阶乘: 10!=2^8 * 3^4 * 5^2 * 7 为了让它快速,让我们假设给定的数字是10,我们事先有素数。我不想先计算阶乘。因为如果给定的数字更大,它最终将超出int类型的范围。所以我遵循的算法是: 首先计算2的幂。一到十之间有五个数字,二除以五。这些数字是2*1,2*2,…,2*5。此外,2还将集合{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}。最后的答案是:

十!=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;
   }
#包括
main()
{
int i,n,计数;
int ara[]={2,3,5,7};
对于(i=0;i0;n--)
{
而(n%ara[i]==0)
{
计数++;
n=n/ara[i];
}
}
printf((%d^%d)”,ara[i],计数);
}
返回0;
}
输出是(2^3)(3^2)(5^1)(7^1)。
我不明白我的代码出了什么问题。有人能帮我吗?

查找no 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;
}
#包括
int main()
{
int c,n,fact=1;
printf(“输入一个数字以计算其阶乘\n”);
scanf(“%d”和“&n”);

对于(c=1;c当n可被某个素数整除时,代码将n除,使n跳跃

e、 当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;
#包括
main()
{
int i,n,计数;
int ara[]={2,3,5,7};
对于(i=0;i0;n--)
{
内部温度=n;
而(温度%ara[i]==0)
{
计数++;
温度=温度/ara[i];
}
}
printf((%d^%d)”,ara[i],计数);
}
返回0;
}更简单的方法:

#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;
}
#包括
int main(int argc,char const*argv[]
{
常数int n=10;
常量int素数[]={2,3,5,7};
对于(int i=0;i<4;i++){
int cur=素数[i];
int-total=0;

while(cur)调试器是在这种情况下帮助您的理想工具。while循环变量应该不同于for循环变量。错误的方法,尤其是这行`n=n/ara[i];`u在这里试图做什么?我的公式是什么:1和10之间的素因子是2、3、5和7,因此S={2,3,5,7}那么10!可以写成这样的形式:10!=(2^a)*(3^b)*(5^c)*7首先计算2的幂。在1和10之间有五个数字,2除以。这些数字是2,4,6,8,10。此外,2还除以集合{1,2,3,4,5}中的两个数字继续这个模式,在1和2之间有一个数字,2除以。然后a=5+2+1=8。剩下的素数也有相同的过程。这就是为什么我用那条线。除以n直到商不再是整数。阶乘素数分解以正则级数的形式创建特定的可计算模式。如果你推导出每个素数的ies方程您可以直接输出结果,而无需搜索。我过去出于不同的原因做过类似的事情。同样,摆动素数可能值得一看,因为它们更接近您试图实现的目标。这并不能回答问题。这就是问题所在。如果给定的数字更大,阶乘w我将超出int类型的范围。所以我要做的是在不计算数字的阶乘的情况下找到素数分解。啊!现在它有意义了。非常感谢。