【题解】多项式输出问题c++版(附有Python版本)

题目描述

一元n次多项式可用如下的表达式表示:

f (x) = anxn+ an-1xn-1 + ... + a1x + a0,a0≠0

其中,aixi 称为i 次项,ai 称为i次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

1. 多项式中自变量为x,从左到右按照次数递减顺序给出多项式。

2. 多项式中只包含系数不为0的项。

3. 如果多项式n次项系数为正,则多项式开头不出现“+”号,如果多项式 n 次项系数为负,则多项式以“-”号开头。

4. 对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于0 次的项,其系数的绝对值为1,则无需输出1)。如果x的指数大于1,则接下来紧跟的指数部分的形式为“x^b”,其中b为x的指数;如果x的指数为1,则接下来紧跟的指数部分形式为“x”;如果x的指数为0,则仅需输出系数即可。

5. 多项式中,多项式的开头、结尾不含多余的空格。

输入描述:

第一行1个整数,n,表示一元多项式的次数。
第二行有n+1 个整数,其中第i 个整数表示第n-i+1 次项的系数,每两个整数之间用空格隔开。

输出描述:

共1行,按题目所述格式输出多项式。

题解:

一元n次多项式可用如下的表达式表示:

f (x) = anxn+ an-1xn-1 + ... + a1x + a0,a0≠0

首先分析题目,题目的意思很简单,就是给定几个数,然后按照要求进行输出就行了,这通常被称为模拟,即题目说什么,我们就模拟着去做什么。

先进行输入,因为题目给定的n的范围是[1,100],所以用int去存储值就行了

在这里有一个小点需要注意,因为题目的多项式输出其中x的次方是倒着输出的,考虑到下面的遍历循环是倒着来的,所以这里我们存储值的时候也应该要倒着存储值。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,i;
    int a[110];
    scanf("%d",&n);
    for (i=n;i>=0;i--){
        scanf("%d",&a[i]);
    return 0;
    }

 

然后根据题目描述的格式进行输出,在这里有一个注意点,主要是关于0/1/-1的讨论问题,还有就是首项、x的一次方、尾项的问题。我在第一个模拟的时候,由于逻辑比较混乱写了一大堆if...else,那样导致的结果就是逻辑很乱、代码不简洁、容易出差错。

所以,我们需要先分析这几个问题的关键。

首先就是如果用单纯的if...else去输出的话,就会发现其非常的繁琐,因为要不断的讨论0/-1/1以及大于0,小于0的问题,所以在这里我决定依次输出符号、系数、x的次方,再对里面的某些特殊情况进行单独讨论

1、对所有元素进行遍历,如果系数为0的话,就什么都不用输出,并且跳过这一层循环。

2、首项元素单独进行判断,如果首项元素是负数,就输出一个负号,为正就什么都不输出。

3、如果不是首项元素,为正输出‘+’,为负输出‘-’

4、再进行下一层系数的判断,如果是1/-1就不需要输出其系数,否则就输出原值的绝对值

5、然后到x的次方的判断,项数为最后一项的话,即i=0的时候,就不需要输出x,不为最后一项的话,还需要再进行一次判断,如果是次方为1的话,就值输出一个x,如果不是,就输出x的i次方。

总的过程大概就是以上的步骤,现在根据这些步骤来编写代码,如下所示:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,i;
    int a[110];
    scanf("%d",&n);
    for (i=n;i>=0;i--){
        scanf("%d",&a[i]);
    }
    for (i=n;i>=0;i--)
    {
        if (a[i]==0) continue;
        if (i==n){
            if (a[i]<0) cout<<'-';
        }
        else{
            if (a[i]<0) cout<<'-';
            else cout<<'+';
        }
        if ((a[i]==1 || a[i]==-1) && i!=0) ;
        else cout<<abs(a[i]);
        if (i==0) ;
        else {
            if (i==1) cout<<'x';
            else cout<<"x^"<<i;
        }
    }
    
    return 0;
}

 Python版本如下:

n = int(input())
# 输入几个值,通过迭代成整型
lst = list(map(int,input().split()))
# 设置次方数
count = len(lst)-1
# 进行遍历
for i in lst:
    # 判断值是否为0
    if i==0:
        count-=1
        continue
    # 输出符号
    if count==len(lst)-1:
        if i<0:
            print('-',end='')
    else:
        if i>0:
            print('+',end='')
        else:
            print('-',end='')
    # 输出系数
    if ((i==1 or i==-1) and count!=0):
        pass
    else:
        print(abs(i),end='')
    # 输出x的次方
    if count==0:
        pass
    else:
        if count==1:
            print('x',end='')
        else:
            print(f'x^{count}',end='')
    # 次方数减1
    count-=1

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiaoxingk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值