C中阶乘的素因子化

时间:2016-07-25 06:31:23

标签: c algorithm

我正在尝试编写一个程序,它将在表单中打印给定数字的阶乘: 10!= 2 ^ 8 * 3 ^ 4 * 5 ^ 2 * 7 为了使它快速,让我们说给定的数字是10,我们事先得到素数。我不想先计算阶乘。因为如果给定的数字更大,它最终将超出int类型的范围。所以我遵循的算法是: 首先计算两个人的力量。在1到10之间有五个数字,两个分为两个。这些数字给出2 * 1,2 * 2,......,2 * 5。此外,两个也在集合{1,2,3,4,5}中划分两个数字。这些数字是2 * 1和2 * 2。继续这种模式,在一到二之间有一个数字,两个分成两个。然后a = 5 + 2 + 1 = 8.

现在看看三个人的力量。从1到10有三个数字,三个分成三个,然后一个数字在一到三之间,三个数字分成三个数字。因此b = 3 + 1 = 4。以类似的方式c = 2。然后集合R = {8,4,2,1}。最后的答案是:

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

所以我写的是:

<ImageView
        android:id="@+id/android_cookie_image_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:scaleType="centerCrop"
        android:src="@drawable/before_cookie" />

,输出为(2 ^ 3)(3 ^ 2)(5 ^ 1)(7 ^ 1)。 我无法理解我的代码有什么问题。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

当某个素数可以对其进行整除时,你的代码会对n进行分割,从而使n跳跃。

e.g。当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;

}

答案 2 :(得分:-3)

寻找无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;
}