【已解决】C语言从n个不同的元素中,每次取出k个不同的元素

news/2024/10/18 18:23:59/

本博文源于c语言基础,旨在通过对思路的解释,编写出组合数的代码,博文分为以下模块1、问题再现,2、代码测试效果3、核心解题思路4、完整源码 重点看解题思路

1、问题再现

从n个不同的元素中,每次取出k个不同的元素,不管其顺序合并成一组,称为组合,组合种数计算公式如下:
C n k = n ! ( n − k ) ! k ! C_n^{k}=\frac{n!}{(n-k)!k!} Cnk=(nk)!k!n!

  1. 定义函数fact(n)计算n的阶乘n!,函数返回值类型是double
  2. 定义函数cal(k,n)计算组合种数,函数返回值是double,要求调用函数fact(n)计算n的阶乘
  3. 定义函数main()输入正数n,输出n的所有组合种数 C n k ( 1 ≤ k ≤ n ) C_n^{k}(1\le{k}\le{n}) Cnk(1kn),要求调用函数cal(k,n)

2、代码测试效果

在这里插入图片描述

3、核心解题思路

难点在于算阶乘,算阶乘的通用公式就是

    int res = 1;//接受结果初始为1for(int i = 1;i<=n;i++){res *= i;//不断乘}

把问题翻译成源码,是个需要不断锻炼的功夫。同样的,cal函数这个除法要想到。

    return fact(n)/(fact(n-k)*fact(k));//获得结果

其余也没什么难点,重点对源码进行理解。

4、完整源码

//
// Created by Administrator on 2021/11/5/005.
//#include<stdio.h>
double fact(int n)
{int res = 1;//接受结果初始为1for(int i = 1;i<=n;i++){res *= i;//不断乘}return res;//返回结果
}
double cal(int n,int k)
{return fact(n)/(fact(n-k)*fact(k));//获得结果
}
int main()
{int n;scanf("%d",&n); //输入for(int i = 1;i<=n;i++){double res = cal(n,i); //交给函数去处理printf("%lf\n",res); //打印结果}return 0;
}

http://www.ppmy.cn/news/714114.html

相关文章

C语言学习之求∑k(k=100)+∑K*k(k=50)+∑1/k(k=10)

求∑k(k100)∑K*k(k50)∑1/k(k10) #include <stdio.h> #include <math.h> void main(){double as0,bs0,cs0;for(int i1;i<100;i){asi;}printf("1...100%d\n",as);for(int j1;j<50;j){bspow(j,2);}printf("1*1...50*50%d\n",bs);for(int …

C语言 计算∑(k=1—100)k+∑(k=1—50)k²+∑(k=1—10)1/k的值

#include <stdio.h> int main(){int n1100,n250,n310;double k,s10,s20,s30;for(k1;k<n1;k){ //计算1—100的和s1s1k;}for(k1;k<n2;k){ //计算1—50的和s2s2k*k;}for(k1;k<n3;k){ //计算1-10的各倒数和s3s31/k;}printf("sum%6f",s1s2s3);return 0; }

c语言三种方法求n的k次方

// 方法一&#xff1a;递归 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int Power(int n,int k) //题目中有两个变量&#xff0c;在设计函数时需要两个形参 {if (k 0){return 1;}else if(k1) {return n;}else{return n*Power(…

K-Means算法的C语言实现

一、聚类和聚类算法 聚类&#xff0c;就是将数据对象划分成若干个类&#xff0c;在同一个类中的对象具有较高的相似度&#xff0c;而不同的类相似度较小。聚类算法将数据集合进行划分&#xff0c;分成彼此相互联系的若干类&#xff0c;以此实现对数据的深入分析和数据价值挖掘…

求单项链表的倒数第k个节点(c语言)

求单项链表的倒数第k个节点&#xff08;只遍历一次&#xff09; 单向链表求倒数第k个节点我们可以先遍历一遍找出链表的长度&#xff0c;再设置一个指针走&#xff08;n-k&#xff09;步可以找到倒数第k个节点。 但是&#xff0c;这需要遍历两次&#xff0c;如果只允许遍历一次…

记一种神奇的C语言语法:KR C

文章目录 记一种神奇的C语言语法&#xff1a;K&R C ——古代C语言函数定义K&R C : identifier-list注意 ANSI C : declarator 记一种神奇的C语言语法&#xff1a;K&R C ——古代C语言 信息来源&#xff1a; ANSI和K&R两种函数定义风格-wangweiming-ChinaUnix…

C语言练习之递归实现n的k次方

文章目录 前言一、思路二、代码以及运行截图1.代码2.运行截图 总结 前言 使用C语言递归计算N的k次方 一、思路 求n的k次方的原理就是&#xff1a; n^k nn……*n&#xff08;k个n进行相乘&#xff09; 可以得到一个公式&#xff1a; f ( k ) { 1 k 0 n ∗ f ( k ) k >…

寻找第K大的数 C语言实现的一种方法

描述 在一个数组中&#xff0c;找到第K 大的数值一个数组&#xff0c;如&#xff1a;[3,2,1,5,6,4] &#xff0c;输入 2&#xff0c;返回&#xff1a;5也就是这个K的取值&#xff0c;是从 1 开始的&#xff0c;不超过数组的最大个数 解决思路 可以使用任意的排查函数&#x…