一、题目大意:
每行输入9个数,这9个数是对应一元多项式的系数。然后,输出对应的一元多项式。
(1)术语必须按递减顺序输出,就是说一元多项式需要从高指数项往低指数项输出;
(2)指数应出现在插入符号“^”之后;
(3)常数项仅显示为常数(指一元多项式的最后一项,此时指数为0);
(4)只应出现具有非零系数的项,除非所有项都具有零系数,在这种情况下应出现常数项;
(5)唯一的空格应该是+或者 - 运算符两侧的单个空格;
(6)如果一元多项式最高项系数是正数的,那么在它之前不应该有其它符号; 负数应以减号开头,如-7x ^ 2 + 30x + 66。
(7)系数为负数的,前面不能有“+”号。 也就是说,输出应该是x ^ 2 - 3x,而不是x ^ 2 + -3x;
(8)常数1和-1应仅作为常数项出现。 也就是说,输出应显示为-x ^ 3 + x ^ 2 + 3x - 1,而不是-1x ^ 3 + 1x ^ 2 + 3x ^ 1 - 1。
二、思路:a1x^8 + a2x^7 + a3x^6 + …. + a7x^2 + a8x + a9
(1)存储方式:用数组arr[10]存储每行输入的9个整数;
(2)输出:A.首先输出系数前面的"+"或者"-"运算符,同时考虑符号两侧是否需要空格;
B.接着输出系数的绝对值,考虑等于1时,出了常数项外,其它项要省略1;
C.输出"x^"或"x",同时考虑指数大于1时,需要输出指数,等于1时,不需要输出;(常数项没有x)
D.当全部为0时,虽然此时是常数,结果为0,但最好写进去;
三、错误程序:超时(Time Limit Exceeded),原因:用了一个while(1)永远循环,这个也是很多新手容易犯的错误
#include <iostream>
using namespace std;
int main() {
int arr[10], i, first, iFab, exp;
while(1) {
first = 1;
for(i = 0; i < 9; i++)
cin >> arr[i];
for(i = 0; i < 9; i++) {
if(arr[i] == 0)
continue;
if(first) {
if(arr[i] < 0)
cout << "-";
first = 0;
}
else
{
if(arr[i] < 0)
cout << " - ";
else
cout << " + ";
}
if(arr[i] < 0)
iFab = -arr[i];
else
iFab = arr[i];
exp = 8 - i;
if(iFab != 1 && exp >= 1)
cout << iFab;
if(exp == 0)
cout << iFab;
if(exp > 1)
cout << "x^" << (8-i);
else if(exp == 1)
cout << "x";
}
if(first)
cout << "0";
cout << endl;
}
return 0;
}
四、优化程序(正确):将while(1)改为while(cin >> arr[0]),有数才输入运行。这样就可以AC了。
#include <iostream>
using namespace std;
// 求绝对值
//int Fabs(int a) {
// if(a < 0)
// return -a;
// return a;
//}
int main(int argc, const char * argv[]) {
int arr[10], i, first, iFab, exp; // iFab存储系数的绝对值,exp存储指数
while(cin >> arr[0]) {
first = 1; // 标记第一项输出
// 输入9个数
for(i = 1; i < 9; i++)
cin >> arr[i];
// 输出一元多项式: 不能出现全部系数都是0,如果是,就为0,常数项了。
for(i = 0; i < 9; i++) {
if(arr[i] == 0) // 为0,直接跳过
continue;
// 输出系数前面的“+”和“-”符号
if(first) { // 系数不为0的第一项输出
if(arr[i] < 0)
cout << "-";
first = 0;
}
else
{
if(arr[i] < 0)
cout << " - ";
else
cout << " + ";
}
// 输出系数
// iFab = Fabs(arr[i]); // 求绝对值
if(arr[i] < 0)
iFab = -arr[i];
else
iFab = arr[i];
exp = 8 - i; // 指数
if(iFab != 1 && exp >= 1) // 系数如果是-1或者1,要把1省略不写,最后常数项例外
cout << iFab;
if(exp == 0) // 如果是常数项,直接输出绝对值
cout << iFab;
// 然后,输出x^和指数
if(exp > 1)
cout << "x^" << exp;
else if(exp == 1)
cout << "x";
} // for循环
if(first) // 如果全部都是0
cout << "0";
cout << endl;
} // while循环
return 0;
}
运行结果:
五、C语言程序:AC
#include <stdio.h>
int main() {
int arr[10], i, first, iFab, exp;
while(scanf("%d", &arr[0]) != EOF) {
first = 1;
for(i = 1; i < 9; i++)
scanf("%d", &arr[i]);
for(i = 0; i < 9; i++) {
if(arr[i] == 0)
continue;
if(first) {
if(arr[i] < 0)
printf("-");
first = 0;
}
else
{
if(arr[i] < 0)
printf(" - ");
else
printf(" + ");
}
if(arr[i] < 0)
iFab = -arr[i];
else
iFab = arr[i];
exp = 8 - i;
if(iFab != 1 && exp >= 1)
printf("%d", iFab);
if(exp == 0)
printf("%d", iFab);
if(exp > 1) {
printf("x^");
printf("%d", exp);
}
else if(exp == 1)
printf("x");
}
if(first)
printf("0");
printf("\n");
}
return 0;
}