令C(m,n)表示从m个数中选取n个数的组合个数
则有递推关系:C(m,n)=C(m-1,n-1)+C(m-1,n)
可采用二维数组dp[m][n]保存C(m,n)的结果,然后从小到大递推计算即可
但注意到m维的结果只和m-1维有关,因此可以用一维数组进行简化
令dp[n]表示当前为止,选出n个数的组合个数,注意外层遍历m次,内层要逆序遍历
最后由于n可能取到1000,结果会很大,一般取余表示防止溢出
C语言代码如下所示:
#include <stdio.h>
long long dp[1001]// 结果可能很大,用长整型
// 但长整型最大也只能表示到C(66,33) = 7219428434016265740
// 因为输入n最大为1000,所以结果可取余表示
const int MOD = 1e9 + 7// 10^9+7,用于结果取余表示
int main() {
int n
scanf("%d", &n)
int m = 2 * n
dp[0] = 1// 初始化,C(m,0)=1
for (int i = 0i <m++i) { // 外层遍历m次
for (int j = nj >= 1--j) { // 内存要倒序遍历
//dp[j] = dp[j] + dp[j - 1]// 若不取余,长整型最大只能表示到n=33
dp[j] = (dp[j] + dp[j - 1]) % MOD// 取余显示,防止结果溢出
}
}
printf("C(%d,%d) = %lld\n", m, n, dp[n])
return 0
}
结果如图:
编译通过,示例如上,C(6,3)=20,结果正确,望采纳~
#include<stdio.h>
int main()
{
int i,n
float sum=0
printf("请输入n:\n")
scanf("%d",&n)
for(i=1i<=ni++)
sum+=(float)1/i
printf("前n项和为sum=%.4f\n",sum)
return 0
}
K&R C
起初,C语言没有官方标准。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。布莱恩·柯林汉(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本书,名叫《The C Programming Language》。这本书被 C语言开发者们称为K&R,很多年来被当作 C语言的非正式的标准说明。人们称这个版本的 C语言为K&R C。
K&R C主要介绍了以下特色:
结构体(struct)类型
长整数(long int)类型
无符号整数(unsigned int)类型
把运算符=+和=-改为+=和-=。因为=+和=-会使得编译器不知道使用者要处理i = -10还是i =- 10,使得处理上产生混淆。
即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最 准要求,许多老旧的编译器仍然运行K&R C的标准。
可以通过除法运算符( / )和求余运算符( % )结合循环来实现分别输出一个整数的每位数字。 具体实现方法可以参考如下程序及注释说明: #includevoid main(){ int dataint tempprintf("请输入一个整数:")scanf("%d", &data)//