【问题标题】:calculating ordered and unordered permutation - C计算有序和无序排列 - C
【发布时间】:2015-11-03 01:57:33
【问题描述】:

尝试计算 C 中数字和选择的有序排列和无序排列。 递归阶乘函数正在工作,排列结果给出随机内存位置

./排列
输入项目数:5
输入要选择的数字:2
有1.#INF00有序排列
有1.#INF00个无序排列

#include <stdio.h>

double ordered_permutation(double total_items, double selection);
double unordered_permutation(double total_items, double selection);
double factorial( double number);

int main() {

    double items;
    double selection;
    printf("Enter number of items: ");
    scanf("%f", &items);
    printf("Enter number to select: ");
    scanf("%f", &selection);

    double ordered_perm;
    double unordered_perm;
    ordered_perm = ordered_permutation( items, selection );
    unordered_perm = unordered_permutation( items , selection );

    printf("There are %f ordered permutations\nThere are %f unordered permutations\n", ordered_perm, unordered_perm);

    return 0;
}

/*    total_items!/ ( total_items! - selection! )    */
double ordered_permutation(double total_items, double selection){
    double permutations;

    permutations = factorial(total_items)/ ( factorial(total_items) - factorial(selection) );

    return permutations;
}

/*    total_items!/ ( ( total_items! - selection! ) selection! )    */
double unordered_permutation(double total_items, double selection){
    double permutations;

    permutations = factorial(total_items)/ ( ( factorial(total_items) - factorial(selection) ) * factorial(selection));

    return permutations;
}

double factorial( double number){
    if( number <= 1 )
        return 1;
    else 
        return  number * factorial((number-1));
}

【问题讨论】:

    标签: c recursion combinations permutation combinatorics


    【解决方案1】:

    将分母调用更改为:

        factorial(total_items - selection)
    

        (factorial(total_items- selection) * factorial(selection))
    

    【讨论】:

      【解决方案2】:

      这不是您问题的完全答案,但使用递归计算 阶乘可能会导致堆栈溢出 [并且相对] 缓慢。

      此外,您将double 用于计数和索引。阶乘是基于整数相乘,结果只能是整数。

      这是一个非递归阶乘函数:

      #if 1
      typedef int value_t;
      #else
      typedef long long value_t;
      #endif
      
      value_t
      factorial(value_t n)
      {
          value_t i;
          value_t f;
      
          f = 1;
      
          for (i = 1;  i <= n;  ++i)
              f *= i;
      
          return f;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-16
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多