SSL_1352【二项式乘方展开式】

SSL_1352[二项式乘方展开式]

题目:
光光最近在研究一个问题: 在整式的乘法中,我们知道(a+b)1=a+b,(a+b)2=a2+2ab+b2,等等,这些都可 以用简单的手算求得。但是我们如果要求的(a+b)n 展开式,就不容易很快手算了。 光光需要你去帮助他,这个时候应该如何去解答这个问题?

题意:
二项式展开

输入:
输入仅一行,为n 的值。

输出:
输出只需输出一行表达式,格式为: (a+b)n=*an +*a(n-1)b+*a(n-2)b2+…+b^n 其中为系数。如果系数为1,则需要省略系数;如果次数为1,则需要省略次数;如果次数为0,则需要省略;如果系数为0,则需要省略这一项。注意:前面(a+b)^n 的次数是必有的。

Sample Input
5
Sample Output
(a+b)5=a5+5a4b+10a3b2+10a2b3+5ab4+b^5

解题思路:
我们可以看到其实样例展开式就是1 5 10 10 5 1
杨辉三角的第六行
可以推出结果其实就是变相求杨辉三角的第N+1行
很简单简单?
高精度!!!

#include
#include
#include 
#include
using namespace std;
int n,a[101][101];
bool ok=1;
void init()//输入
{
    cin>>n;
    cout<<"(a+b)^"<<n<<'=';
    if(n==1)cout<<"a+b";
    else if(n==2)cout<<"a^2+2ab+b^2";
    else if(n==3)cout<<"a^3+3a^2b+3ab^2+b^3";
    else if(n==4)cout<<"a^4+4a^3b+6a^2b^2+4ab^3+b^4";//稳妥起见打前四个的表
    if(n<=4)exit(0);
    memset(a,0,sizeof(a));
    a[1][100]=1;
}
void diedai(int m)//迭代求下一行
{
    a[m+1][100]=1;
    int g;
    for(int i=m;i>=2;i--)
    {
        g=0;
        for(int j=100;j>=1;j--)
        {
            a[i][j]=a[i-1][j]+a[i][j]+g;
            g=a[i][j]/10;
            a[i][j]%=10;
        }
    }
}
void work()
{
    for(int i=1;i<=n;i++)diedai(i);//杨辉三角第n行的迭代算法
}
void output()//输出
{
    for(int i=1;i<=n+1;i++)
    {
        if(ok)ok=0;
        else cout<<'+';
        int j=1;
        while(a[i][j]==0&&j<100)j++;
        if(j!=100||a[i][j]!=1)
        {
            for(;j<=100;j++)cout<<a[i][j];//输出
        }
        if(i==1)cout<<"a^"<<n;
        else if(i==2)cout<<"a^"<<n-1<<'b';//前两项特殊
        else if(i==n+1)cout<<"b^"<<n;
        else if(i==n)cout<<"ab^"<<n-1;//后两项特殊
        else cout<<"a^"<<n+1-i<<"b^"<<i-1;//打表起因
    }
}
int main()
{
    init();
    work();
    output();
    return 0;
}

注:本人第一次发博客,如有不足敬请指正!

你可能感兴趣的:(高精度)