利用杨辉三角形可以快速的列出牛顿二项式分解。
如:杨辉三角第6行值是 1 6 15 20 15 6 1
对应的二项式分解就是
(
m
+
n
)
6
=
m
6
+
6
m
5
n
+
15
m
4
n
2
+
20
m
3
n
3
+
15
m
2
n
4
+
6
m
n
5
+
n
6
(m+n)^6=m^6+6m^5n+15m^4n^2+20m^3n^3+15m^2n^4+6mn^5+n^6
(m+n)6=m6+6m5n+15m4n2+20m3n3+15m2n4+6mn5+n6
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 杨辉三角
{
public class Program
{
private const string spaceChar = " ";
/// <summary>
/// 主函数
/// </summary>
/// <param name="args"></param>
public static void Main( string[] args )
{
PrintYangHui( 13 );
//PrintYangHui( 8, 8 );
YangHui( 13 );
Console.ReadLine();
}
/// <summary>
/// 递归调用-打印三角形
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static int[] PrintYangHui( int n )
{
if ( n == 1 ) return Print( new int[] { 1 } );
if ( n == 2 )
{
PrintYangHui( n - 1 );
return Print( new int[] { 1, 1 } );
}
int[] pR = PrintYangHui( n - 1 );
int[] R = new int[n];
R[0] = 1;
for ( int i = 1; i < R.Length - 1; i++ ) R[i] = pR[i] + pR[i - 1];
R[R.Length - 1] = 1;
return Print( R );
}
/// <summary>
/// 格式化输出到控制台的样式
/// </summary>
/// <param name="result"></param>
public static int[] Print( int[] result )
{
StringBuilder Space = new StringBuilder();
string spaceChar = " ";
for ( int i = 0; i < result.Length; i++ ) Console.Write( result[i].ToString() + spaceChar );
Console.WriteLine();
return result;
}
/// <summary>
/// 打印居中的杨辉三角形
/// </summary>
/// <param name="totalLevel">总的层次数,用来控制第一行的前面需要多少个分隔符</param>
/// <param name="level ">打印第几层</param>
/// <returns></returns>
public static int[] PrintYangHui( int totalLevel, int level )
{
if ( Level == 1 ) return Print( totalLevel, new int[] { 1 } );
if ( Level == 2 )
{
PrintYangHui( totalLevel, Level - 1 );
return Print( totalLevel, new int[] { 1, 1 } );
}
int[] pR = PrintYangHui( totalLevel, Level - 1 );
int[] R = new int[Level];
R[0] = 1;
for ( int i = 1; i < R.Length - 1; i++ ) R[i] = pR[i] + pR[i - 1];
R[R.Length - 1] = 1;
return Print( totalLevel, R );
}
/// <summary>
/// 打印居中的杨辉三角形
/// </summary>
/// <param name="result"></param>
public static int[] Print( int totalLevel, int[] result )
{
StringBuilder Space = new StringBuilder();
for ( int i = totalLevel; i > result.Length; i-- ) Space.Append( spaceChar );
Console.Write( Space );
for ( int i = 0; i < result.Length; i++ ) Console.Write( FormatString( 5, result[i] ) + spaceChar );
Console.WriteLine();
return result;
}
/// <summary>
/// 格式化数字串
/// </summary>
/// <param name="Len"></param>
/// <param name="num"></param>
/// <returns></returns>
public static string FormatString( int Len, int num )
{
char[] outString;
string strNum = num.ToString();
int startIndex = 0;
if ( strNum.Length < Len )
{
outString = new char[Len];
startIndex = ( Len - strNum.Length ) / 2;
}
else
outString = new char[strNum.Length];
for ( int i = 0; i < outString.Length; i++ )
{
if ( i >= startIndex && i < startIndex + strNum.Length )
outString[i] = strNum[i - startIndex];
else
outString[i] = ' ';
}
return new String( outString );
}
/// <summary>
/// 打印杨辉三角型的某一层,通过位置,计算出每层每个位置的数值,节省运行空间
/// </summary>
/// <param name="N">本次打印二项式N次方的系数</param>
public static void Print( int N )
{
for ( int k = 0; k <= N; k++ )
{
int V = 1; // 用来保存N阶乘除以i阶乘的值
int S = 1; // 用来保存N-i的阶乘
int I = 0;
for ( int i = k + 1; i <= N; i++ ) // N阶除以(N-i)阶后再除以i阶
{
V *= i;
I = ( N - i + 1 );
S *= I;
if ( V % I == 0 )// 如果此时V可以被I整除,就先整除,以免最终V的阶乘太大导致数据溢出
{
V /= I;
S /= I;
}
else if ( V % S == 0 )// 如果此时V可以被S整除,就先整除,以免最终V的阶乘数太大导致数据溢出
{
V /= S;
S = 1;
}
}
V /= S;
Console.Write( V.ToString() + spaceChar );
}
Console.WriteLine();
}
/// <summary>
/// 打印居中的杨辉三角形
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
public static void YangHui( int totalLevel)
{
for ( int i = 0; i < totalLevel; i++ )
{
//StringBuilder Space = new StringBuilder();
//for ( int j = TotalLevel; j > i; j-- ) Space.Append( spaceChar );
//Console.Write( Space );
Print( i );
}
}
}
}