计算有序和无序排列 - C.

时间:2015-11-03 01:57:33

标签: c recursion combinations permutation combinatorics

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

./置换
输入项目数:5
输入要选择的数字:2
有1.#INF00有序排列
有## 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));
}

2 个答案:

答案 0 :(得分:0)

将分母调用更改为:

    factorial(total_items - selection)

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

答案 1 :(得分:0)

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

此外,您正在使用#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; } 来处理计数和索引。因子是基于乘以整数,结果只能是整数。

这是一个非递归因子函数:

tableA.code.Split('-').FirstOrDefault() equals tableB.SiteCode