第五周编程题_多项式加法

题目内容:

一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。

输入格式:

总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。

输出格式:

从最高幂开始依次降到0幂,如:
2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。

输入样例:

6 2 5 3 3 12 1 6 0 20 6 2 5 3 2 12 1 6 0 20

输出样例:

4x6+6x5+12x3+12x2+12x+40

时间限制:500ms内存限制:32000kb

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package 零基础学Java语言_翁恺;

import java.util.Scanner;

public class Fifth_Week
{

public static void main(String[] args)
{
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int[] a = new int[101];
int m = 0, n = 0;
boolean flag = false;
for(int i=0;i<100;i++)
a[i]=0;
int m_max = 0;
// 读入第一个多项式
do
{
m = in.nextInt();
n = in.nextInt();
a[m] = n;
if (m > m_max)
m_max = m;
}while(m!=0);
// 读入第二个多项式
do
{
m = in.nextInt();
n = in.nextInt();
a[m] += n;
if (m > m_max)
m_max = m;
}while (m!=0);
for (int j = m_max; j >=0; j--)
{
if (a[j] != 0)
{
if(a[j]>0&&flag==true)
System.out.print("+");
if(a[j]!=1)
System.out.print(a[j]);
if(j!=1&&j!=0)
System.out.print("x"+j);
if(j==1)
System.out.print("x");
flag=true;
}
}
in.close();
}

}

只有一个测试点没过.....不想改了.....

总结:

用一个大小为101的数组来存系数,数组的下标即为幂指数....
若系数不为0则输出...
需要注意的是:
系数为1或-1时不用输出系数;
系数小于0时,不输出加号;
幂指数为1时,不输出幂指数;
幂指数为0时,只输出系数;
开始的思路是对幂指数为0或1时的输出单独处理,但没有考虑到系数为1或-1的情况...导致没有一个测试点通过...

错误代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package 零基础学Java语言_翁恺;

import java.util.Scanner;

public class Fifth_Week
{

public static void main(String[] args)
{
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in

);
int[] a = new int[101];
int m = 0, n = 0;
boolean flag = false;
for(int i=0;i<100;i++)
a[i]=0;
int m_max = 0;
// 读入第一个多项式
do
{
m = in.nextInt();
n = in.nextInt();
a[m] = n;
if (m > m_max)
m_max = m;
}while(m!=0);
// 读入第二个多项式
do
{
m = in.nextInt();
n = in.nextInt();
a[m] += n;
if (m > m_max)
m_max = m;
}while (m!=0);
for (int j = m_max; j > 1; j--)
{
if (a[j] != 0)
{
if (flag&&a[j]>0)
System.out.print("+");
if(a[j]==-1)
System.out.print("-");
flag = true;
System.out.print(a[j] + "x" + j);
}
else
continue;
}
// 处理幂次为1的情况
if (a[1] != 0)
{
if (flag&&a[1]>0)
System.out.print("+");
if(a[1]==-1)
System.out.print("-");
System.out.print(a[1] + "x");
flag = true;
}
// 处理幂次为0的情况
if (a[0] != 0)
{
if (flag)
System.out.print("+");
System.out.print(a[0]);
}
// System.out.println();
in.close();
}

}

补充:

    把源码发到了MOOC的讨论区,在热心网友的帮助下,终于找到了有一个测试点没通过的原因.....
    对于系数全部为0的情况,程序会无输出.....
    例:对于下列这组数据

6 3 2 5 0 3 6 -3 2 -5 0 -3

在`in.close()`前面加上这一段就好了 `if(!flag)` `  System.out.print("0");`
您的支持是我继续创作最大的动力!

欢迎关注我的其它发布渠道