XJOI 1210 二项式展开 题解

时间:1s 空间:256M

题目描述:

输出(a+b)^n的展开式

输入格式:

输入一行,包含一个整数n

输出格式:

见样例输出,注意空格的使用

样例输入1:

2

样例输出1:

(a+b)^2 = a^2 + 2*a*b + b^2

样例输入2:

3

样例输出2:

(a+b)^3 = a^3 + 3*a^2*b + 3*a*b^2 + b^3

约定:

0<=n<=30

提示:

此题显然要用到二项式定理,需要一点数学基础。说得通俗一点,就是杨辉三角(当然还有其他解法)。具体的每一项的系数可以递推出来。当n=x时,系数从左往右刚好是杨辉三角的x+1行。当然,这道题还要特判,就是n=0的时候,很容易漏掉。

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 40
int a [ N ] [ N ] , n ;
using namespace std ;
int main ( )
{
    scanf ( "%d" , & n ) ;
    memset ( a , 0 , sizeof ( a ) ) ;
    a [ 1 ] [ 1 ] = 1 ;
    for ( int i = 2 ; i <= n + 1 ; i ++ )
        for ( int j = 1 ; j <= i ; j ++ ) 
            a [ i ] [ j ] = a [ i - 1 ] [ j ] + a [ i - 1 ] [ j - 1 ] ;
    printf ( "(a+b)^%d = " , n ) ;
    if ( n == 0 ) printf ( "1" ) ;
    else for ( int i = 1 ; i <= n + 1 ; i ++ )
        {
            if ( a [ n + 1 ] [ i ] != 1 ) printf ( "%d*" , a [ n + 1 ] [ i ] ) ;
            if ( i != n + 1 ) printf ( "a" ) ;
            if ( i < n ) printf ( "^%d" , n - i + 1 ) ;
            if ( i != 1 && i != n + 1 ) printf ( "*" ) ;
            if ( i != 1 ) printf ( "b" ) ;
            if ( i > 2 ) printf ( "^%d" , i - 1 ) ;
            printf ( " " ) ;
            if ( i != n + 1 ) printf ( "+" ) ;
            printf ( " " ) ;
        }  
    return 0 ;
}

当然,上面的代码还可以升级,节省一点空间,将二维数组改一位数组。虽然这么改意义不大,都能过,但毕竟是一种思想。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#define N 40
int a [ N ] , n ;
using namespace std ;
int main ( )
{
    scanf ( "%d" , & n ) ;
    memset ( a , 0 , sizeof ( a ) ) ;
    a [ 1 ] = 1 ;
    for ( int i = 2 ; i <= n + 1 ; i ++ )
        for ( int j = i ; j >= 1 ; j -- ) 
            a [ j ] = a [ j ] + a [ j - 1 ] ;
    printf ( "(a+b)^%d = " , n ) ;
    if ( n == 0 ) printf ( "1" ) ;
    else for ( int i = 1 ; i <= n + 1 ; i ++ )
        {
            if ( a [ i ] != 1 ) printf ( "%d*" , a [ i ] ) ;
            if ( i != n + 1 ) printf ( "a" ) ;
            if ( i < n ) printf ( "^%d" , n - i + 1 ) ;
            if ( i != 1 && i != n + 1 ) printf ( "*" ) ;
            if ( i != 1 ) printf ( "b" ) ;
            if ( i > 2 ) printf ( "^%d" , i - 1 ) ;
            printf ( " " ) ;
            if ( i != n + 1 ) printf ( "+" ) ;
            printf ( " " ) ;    //行末空格没关系的
        }    
    return 0 ;
}

相关链接:

XJOI 题解小全:
https://blog.csdn.net/zj_mrz/article/details/80949787

XJOI 3265 Climb the stairs 爬楼梯 题解:
https://blog.csdn.net/zj_mrz/article/details/80970052

猜你喜欢

转载自blog.csdn.net/zj_mrz/article/details/80969339