一元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;
}
n = int(input())
lst = list(map(int,input().split()))
然后根据题目描述的格式进行输出,在这里有一个注意点,主要是关于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;
}
n = int(input())
lst = list(map(int,input().split()))
count = len(lst)-1
for i in lst:
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='')
if count==0:
pass
else:
if count==1:
print('x',end='')
else:
print(f'x^{count}',end='')
count-=1