二项式展开式

做题感想:

下面给的程序是比赛时自己打的,整整弄了我一个多小时~
结束后,看了看老师的标程,感觉疯了~就几个判断~
然后呢~打了个表,交上去,本来想扔上来,发先42024 bytes,我又没保存程序,只能在题库上打开,但是程序长度过大打不开bi————

题目大意:

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

输入

  输入仅一行,一个整数n。

输出

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

样例输入

样例输入1
3

样例输入2
5

样例输出

样例输出1
(a+b)^3=a^3+3a^2b+3ab^2+b^3

样例输出2
(a+b)^5=a^5+5a^4b+10a^3b^2+10a^2b^3+5ab^4+b^5

数据范围限制

30%的数据:n≤18;
60%的数据:n≤34;
100%的数据:n≤66。
————————看这里————————

解题思路:

先一个杨辉三角~,然后一系列判断烦死我了

#include <cstdio>
#include <cstring>
#include <algorithm> 
using namespace std;
int n,m,a[501],b[501],l;unsigned long long d[501][501];
void yhsj()
{
    for(int i=2;i<=n;i++)
     for (int j=2;j<=i;j++)
      d[i][j]=d[i-1][j-1]+d[i-1][j];
}
int main()
{
    freopen("power.in","r",stdin);
    freopen("power.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
     d[i][1]=1,d[i][i+1]=1;
    yhsj();//杨辉三角求C(n,i)
    printf("(a+b)^%d=",n);
    for (int i=0;i<=n;i++)
    //一系列骚判断,if语句太多,就不写解析了~
     {
        if (i==0) {if (n==1) printf("a"); else {printf("a^");printf("%d",n);}continue;}
        if (i==n) {if (n==1) printf("+b"); else {printf("+b^");printf("%d",n);}continue;}
        l=n-i;
        if (d[n][i+1]==0) continue;
        if (l!=0)
        {
             if (l==1&&i==1&&d[n][i+1]==1) {printf("+ab");continue;}
             if (l!=1&&i==1&&d[n][i+1]==1) {printf("+a^");printf("%d",l);printf("b");continue;}
             if (l==1&&i!=1&&d[n][i+1]==1) {printf("+ab^");printf("%d",i);continue;}
             if (l!=1&&i!=1&&d[n][i+1]==1) {printf("+a^");printf("%d",l);printf("b^");printf("%d",i);continue;}
             if (l==1&&i==1&&d[n][i+1]!=1) {printf("+");printf("%lld",d[n][i+1]);printf("ab");continue;}
             if (l!=1&&i==1&&d[n][i+1]!=1) {printf("+");printf("%lld",d[n][i+1]);printf("a^");printf("%d",l);printf("b");continue;}
             if (l==1&&i!=1&&d[n][i+1]!=1) {printf("+");printf("%lld",d[n][i+1]);printf("a");printf("b^");printf("%d",i);continue;}
             if (l!=1&&i!=1&&d[n][i+1]!=1) {printf("+");printf("%lld",d[n][i+1]);printf("a^");printf("%d",l);printf("b^");printf("%d",i);continue;}
        }
        if (i==1&&d[n][i+1]==1) {printf("+b"); continue;}
        if (i!=1&&d[n][i+1]==1) {printf("+b^");printf("%d",i); continue;}
        if (i==1&&d[n][i+1]!=1) {printf("+");printf("%lld",d[n][i+1]);printf("b"); continue;}
        if (i!=1&&d[n][i+1]!=1) {printf("+");printf("%lld",d[n][i+1]);printf("b^");printf("%d",i);continue;}
    }
}

End

转载于:https://www.cnblogs.com/Juruo-HJQ/p/9306944.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值