• 数据结构/PTA-一元多项式的乘法与加法运算/数组/链表


    一元多项式的乘法与加法运算


     

    输入格式:

    输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

    输出格式:

    输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

    输入样例:

    4 3 4 -5 2  6 1  -2 0
    3 5 20  -7 4  3 1

    输出样例:

    15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
    5 20 -4 4 -5 2 9 1 -2 0

    思路 

    用了太多次链表实在是用吐了,虽然运行起来很爽,但是编写太麻烦了,换数组解决。这里参考了一下其他大佬的思路

    问题的关键在于变量其实是两个(指数和系数),放在一起紧挨着或分成两个数组都不好处理,尤其是多项式相乘是一种交叉相乘的计算。

    比较巧妙的处理方式是将取数组的位置为指数,该位置对应的值为系数。

    应注意反之不可,因为可以存在n倍的x0(即常数),而不存在0倍的xn。区别于其他干扰数可以通过初始化数组为0来实现。

    参考:https://www.cnblogs.com/yuxiaoba/p/8326018.html

            https://www.cnblogs.com/Jie-Fei/p/10138885.html


    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define P 10000
    int main()
    {
        int a[10000]= {0},b[10000]= {0};//输入数组
        int c[10000]= {0},d[10000]= {0};//结果数组
        int n,m;
        int i,j;
        int flag;         //用于判断输出空格
        int x,y;          //系数&指数

        scanf("%d",&n);
        for(i=0; i<n; i++)
          {
          scanf("%d %d",&x,&y);
          a[y]=x;                         //指数为位置,系数为数组
        }


        scanf("%d",&m);         //同上输入
        for(i=0; i<m; i++)
        {
            scanf("%d %d",&x,&y);
            b[y]=x;
         }


         for(i=P-1; i>=0; i--)                //////////两数相乘
        {
          if(a[i]!=0)
        {
         for(j=0; j<P; j++)
        {
          if(b[j]!=0)
        {
        c[i+j]+=a[i]*b[j];
             }
          }
       }


        flag=0;                        //输出乘式
        for(i=P-1; i>=0; i--)
        {
          if(c[i]!=0)
        {
        if(flag!=0)
        printf(" ");
        printf("%d %d",c[i],i);
        flag++;
         }
        }
        if(flag==0 )                //扣分点
        {
          printf("0 0");
        }
        printf(" "); //换行

        for(i=P-1; i>=0; i--)        //两式相加
        {
          if(a[i]!=0)
          d[i]+=a[i];
           if(b[i]!=0)
          d[i]+=b[i];
        }


        flag=0;                        //输出加式
        for(i=P-1; i>=0; i--)
        {
          if(d[i]!=0)
        {
        if(flag!=0)
        printf(" ");
        printf("%d %d",d[i],i);
        flag++;
        }
        }
        if(flag==0 )           //扣分点
        {
        printf("0 0");
        }
    }

  • 相关阅读:
    4.3.4 查询语法基础(2)
    4.3.4 查询语法基础(1)
    一个存储过程调用另一个存储过程 (2009-12-29 13:57:05)
    4.3.3 基于行的操作
    4.3.2 基于集合的操作
    4.3 数据操纵语言(DML)
    4.2 从哪儿开始
    子查询、联合查询和连接查询
    4.1 SQL的本质
    本书说明
  • 原文地址:https://www.cnblogs.com/elegantcloud/p/13708141.html
Copyright © 2020-2023  润新知