因为我一看到杨辉三角形,想到的就是组合,
从第0行开始第一行:C(0,0)
第一行:C(1,0)、C(1,1)
第二行:C(2.0)、C(2.1)、C(2.2)
下面以此类推。
所以就是写一个C(n,m)的函数来解决。
C(m,n)=(n*(n-1)*……(n-m+1))/(m*(m-1)*……1)=(n/m)*(n-1/m-1)**((n-m+1)/1)
C(m,n)=(n/m)*C(m-1,n-1) //一个递推公式
当m=1时,C(m,n)=n-m+1 //递归结束条件
当m=0时,C(m,n)=1 //特殊情况
注意:由于涉及到两数相除,可能会出现精度缺失情况所以,公式改为
C(m,n)=(n*C(m-1,n-1))/m,会保留一定精度,还有就是m,n和返回类型均要改成实数型,最后可以用另一个接口实现结果的类型转换。
以下是代码实现:
#include<iostream>
using namespace std;
long double CC(long double n,long double m) {
if (m == 0) return 1;
if (m == 1) return n - m + 1;
return n*CC(n - 1, m - 1)/m;
}
int C(int n, int m) {
return CC(n, m);
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
cout << C(i, j) << ' ';
cout << endl;
}
return 0;
}
输入:20