#因式分解

题目描述

33DAI 经常在数学作业的参考答案中看到:“注意到 3𝑥^2−2𝑥−5=(𝑥−1)(3𝑥+5) 所以 ……” 这样的答案。但是他自己写题时总注意不到,所以他很生气。

为了出题,33DAI 决定给你一个 ({i}x+{n})({j}x+{m}) 这样形式的字符串。其中 {i},{j},{n},{m} 都是大于等于 0 的整数。去掉这个括号显然可以得到一个形如 𝑎𝑥^2+𝑏𝑥+𝑐 的多项式,请将其改写成字符串 {a}x^2+{b}x+{c} 的形式,并在第一行按照下面的格式输出:

  • 如果 {a}{b}{c} 中有 0,则去掉对应的那一项,并紧接着去掉多余的 + 号。
  • 如果 {a}{b} 中有 1,则那一项只保留 x^2  x,不写系数。

然后这显然可以再考考你,如果方程 𝑎𝑥^2+𝑏𝑥+𝑐=0存在整数解,则在第二行输出其中的一个整数解(任意一个都行),否则在第二行输出 No

输入格式

输入 ({i}x+{n})({j}x+{m}) 这样形式的一个字符串,其中 {i},{j},{n},{m} 都是大于等于 0 的整数。

输出格式

第一行按格式要求输出去掉了小括号后的多项式。

第二行按要求输出一个整数解或者字符串 No

输入数据 1

(7x+3)(1x+1)

输出数据 1 

7x^2+10x+3
-1

输入数据 2

(1x+0)(0x+1)
 

输出数据 2

x
0

输入数据 3

(1x+0)(0x+0)

输出数据 3

33

样例 3 解释

显然此时多项式为 0𝑥^2+0𝑥+0,按要求第一行会得到空串。0𝑥^2+0x+0=0 中所有整数都是 x 的整数解。

输入数据 4

(0x+3)(0x+3)

输出数据 4

9
No

样例 4 解释

显然此时多项式为 0𝑥^2+0𝑥+9,按要求第一行会得到 90𝑥^2+0𝑥+9=0 无解,所以第二行输出 No

数据规模与约定

对于 100%100% 的数据,保证 {i},{j},{n},{m} 都不超过 109109

  • 子任务 1(10 分):保证 {i},{j},{n},{m} 都是一位数。
  • 子任务 2(20 分):保证 𝑎𝑥2+𝑏𝑥+𝑐=0ax2+bx+c=0 不存在整数解。
  • 子任务 3(30 分):保证 {i},{j},{n},{m} 都是大于 0
  • 子任务 4(40 分):没有特殊限制。

代码呈现

#include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
#define ll long long 
using namespace std;
//ll zz1,zz2;
string s;
bool ff;
int zh=0;
double ans1,ans2;
ll num[4];
int idx;
bool zs(double x)
{
    if((int)x==x) return true;
    return false;
}
int main()
{
    //freopen("uqe.in","r",stdin);
    //freopen("uqe.out","w",stdout);
    cin>>s;
    ll len=s.size()-1;
    for(int i=0;i<=len;++i)
    {
        //判断是否是一个数字 
        if(s[i]>='0' && s[i]<='9')
        {
            ff=true;
            zh=zh*10+s[i]-'0'; 
        }
        else 
        {
            //储存数字 
            if(ff)
            {
            //    cout<<zh<<endl;
                num[++idx] = zh;
            }
            zh=0; 
            ff=false;
        }
    }
    //计算出 a b c
    ll a = num[1]*num[3];
    ll b = num[2]*num[3]+num[1]*num[4];
    ll c = num[2]*num[4];   
    //cout<<a<<" "<<b<<" "<<c<<endl;
    /*
    ll a = (s[1]-'0')*(s[7]-'0');
    ll b = (s[4]-'0') * (s[7]-'0') + (s[1]-'0')*(s[10]-'0');
    ll c=(s[4]-'0') * (s[10]-'0');
    */
//    cout<<a<<" "<<b<<" "<<c<<" "<<endl;
//浅浅的特判一下特殊情况 
    if(a==0 && b==0  && c==0)
    {
        cout<<33<<endl;
        return 0;
    }
    if(a==0 && b==0 && c!=0)
    {
        cout<<c<<endl;
        cout<<"No"<<endl;
        return 0; 
    }
    if(a==0 && b!=0 && c==0)
    {
        if(b==1) cout<<'x'<<endl;
        else 
        {
            cout<<b<<'*'<<'x'<<endl;
        }
        cout<<0<<endl;
        return 0;
    }
    if(a==0)
    {
        double ans=-c*1.0/b;
        double sum=-c/b;
        if(ans==sum) cout<<sum;
        else cout<<"No";
        return 0;
    }
    if(a==0 && b!=0 && c==0)
    {
        if(b==1) cout<<'x'<<endl;
        else 
        {
            cout<<b<<'*'<<'x'<<endl;
        }
        cout<<0<<endl;
        return 0;
    }
    //计算ax^2+bx+c=0是否有整数解-大功告成 
    ans1 = (-b+sqrt(b*b-4*a*c))*1.0/(2*a);
//    cout<<ans1<<endl;
    zz1 =  (-b+sqrt(b*b-4*a*c))/(2*a);
//    cout<<zz1<<endl;
    if(b*b-4*a*c<0) 
    {
        cout<<"No";
        return 0;
    }
    zz2 = (-b-sqrt(b*b-4*a*c))/(2*a);
//    cout<<zz2; 
    ans2 = (-b-sqrt(b*b-4*a*c))*1.0/(2*a);
//    cout<<ans2;
    cout<<a<<"*x^2+"<<b<<"*x+"<<c<<endl;
    
    if(zs(ans1)) cout<<ans1;
    else if(zs(ans2)) cout<<ans2;
    else cout<<"No";
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值