一道之前未完成的
关于数组的编程题:
题目:
![](https://i-blog.csdnimg.cn/blog_migrate/c540d45d98a7ca93b19087ef572d1d9f.png)
输入格式:
总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式:
从最高幂开始依次降到0幂,如:
2×6+3X5+12×3-6K+20 注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
从最高幂开始依次降到0幂,如:
2×6+3X5+12×3-6K+20 注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
输入样例:
6 2
5 3
3 12
1 6
0 20
6 2
5 3
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
1 6
0 20
输出样例:
4x6+6x5+12x3+12x2+12x+40
前期思路:
- 由于程序要处理的幂最大是100,因此要用数组存储如此多的变量;
- 由于输入的数据由很多行组成,有两种方案:一是每次读一行,处理;一是每次读完所有数据,存储到数组中,再处理。显然后者更好。
- 由于输入中“第一行一定是最高幂,最后一行一定是0次幂”,因此取“a[i]!=0”,为终止读值条件;
- 输入的数据中有两列,因此用两大类数组分别存储,;考虑到前后两段多项式,因此用“int a[100],b[100],c[100],d[100];”存储两段多项式的幂次和系数;用“a[i],b[i]”捆绑每一行输入的数据。
![](https://i-blog.csdnimg.cn/blog_migrate/071d023a9bcdb803d5a97868164749a3.png)
到此为止准备工作完成,数据读入完毕。
多数组连续交错比相等:
下面要做的是将两大类数组中幂次相等者系数相加,再按规定输出,需要注意的是:一次幂的“1”省略,零次幂的“0”和“x"都省略,各项之间有+号连接。
关于多数组连续交错比相等,一开始采用了这样的方案:
- 将前段多项式的幂次放在外循环,让后段多项式的幂次依次去比较,相等相加,输出结果。
但这种方案存在问题:一是输入的幂次不一定按顺序排列,只是 第一行一定是最高幂,最后一行一定是0次幂,这样会造成输出的结果幂次从左到右不是依次降低的;二是当前段多项式的幂次间断分布时,可能中间漏掉的幂次后端中有,这样输出结果就漏项;
考虑到幂次从最高到最低,无论中间有没有缺项和是否乱序,我们都可以让多项式的幂次去和依次减小的幂次变量比较,若相等,把系数存放到求和存储器中,输出;需要注意的一个细节是:每一轮循环后,都需要把求和存储器归零。
因此有了下面的方案:
- 取一变量,以数组中第一个元素a[0]赋初值,依次递减;让各幂次数组与该变量比较,若相等,存放于求和存储器中,一轮循环最后,输出;
程序
如下:
![](https://i-blog.csdnimg.cn/blog_migrate/e30023b360617fd5b40be2ee5def5bc5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8f5825882869ca803d4098c587eb14f3.png)
结语:
从这道题中可以看出,算法的形成需要考虑到方方面面,同一个问题也有多种算法,不应该拘泥于一个。当然上述的算法也还可以改进,欢迎指正!