7-2 一元多项式的乘法与加法运算(20 分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
题意理解
算法思路:1、由上图可看出本题中多项式加法是将指数相同的系数相加,多项式乘法是各项的系数相乘指数相加
2、一开始想的是模仿浙江大学慕课何老师用链表写的,但是看了一下不仅思想比较复杂,代码量也蛮大
有兴趣可以通过此链接看看http://www.icourse163.org/learn/ZJU-93001?tid=1001757011
3、下面是用数组实现的,其关键思想是将指数为 z 的系数 x 放在数组的z位置上
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define N 10000 5 6 /*输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数 7 (绝对值均为不超过1000的整数)。数字间以空格分隔。 8 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。 9 数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。*/ 10 int main() 11 { 12 int a[N] = {0}; 13 int b[N] = {0}; 14 int c[N] = {0}; //求积 15 int d[N] = {0}; //求和 16 int i ,j; 17 int x,z ; //系数 指数 18 int cnt=0; 19 20 scanf("%d",&i); //读入第一个单项式 21 while( i-- ){ 22 scanf("%d %d",&x,&z); 23 a[z] += x; //指数为z的系数放在z位置上 24 } 25 26 scanf("%d",&i); //读入第二个单项式 27 while( i-- ){ 28 scanf("%d %d",&x,&z); 29 b[z] += x; 30 } 31 32 //多项式乘法 33 for( i=N-1; i>=0; i--){ 34 35 if( a[i] ){ 36 for( j=0; j<N; j++){ 37 if( b[j]){ 38 c[ i+j ] += a[i]*b[j]; 39 } 40 } 41 } 42 } 43 44 //输出多项式乘法结果 45 for( i=N-1; i>=0; i--){ 46 47 if( c[i] ){ 48 if( cnt ){ 49 //处理结尾不能有多余空格 50 printf(" "); 51 } 52 printf("%d %d",c[i],i); 53 cnt++; 54 } 55 } 56 if( !cnt ){ 57 printf("0 0"); 58 } 59 printf("\n"); 60 61 //多项式加法 62 for( i=N-1; i>=0; i--){ 63 if( a[i]){ 64 d[i] += a[i]; 65 } 66 } 67 for( j=N-1; j>=0; j--){ 68 if( b[j]){ 69 d[j] += b[j]; 70 } 71 } 72 73 //输出多项式加法结果 74 cnt = 0; 75 for( i=N-1; i>=0; i--){ 76 if( d[i] ){ 77 if( cnt ){ 78 printf(" "); 79 } 80 printf("%d %d",d[i],i); 81 cnt++; 82 } 83 } 84 if(!cnt){ 85 printf("0 0"); 86 } 87 88 return 0; 89 }
在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!