版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fighting123678/article/details/82717085
一、选择题
二、编程题
1、一元多项式的乘法与加法运算 (20 分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
答案
#include <bits/stdc++.h>
int a[1001];
int b[1001];
int c[2002];
int multiple()
{
memset(c,0,sizeof(c));
int flag=0;
int t=0;
for(int i=0; i<1001; i++)
{
for(int j=0; j<1001; j++)
{
if(a[i]!=0&&b[j]!=0)
{
c[i+j]+=a[i]*b[j];
if(c[i+j]!=0) flag=1;//不知道为什么这一句要放在这里;
}
}
}
if(flag==0)
{
printf("0 0\n");
return 0;//别忘记了,直接return,不再继续了;
}
else
{
for(int i=2002; i>=0; i--)
{
if(c[i]!=0)
{
if(t==0)
{
printf("%d %d",c[i],i);
t=1;
}
else
printf(" %d %d",c[i],i);
}
}
}
printf("\n");
return 0;
}
int add()
{
memset(c,0,sizeof(c));
int h=0,g=0;
for(int i=0; i<1001; i++)
{
c[i]=a[i]+b[i];
if(c[i]!=0) h=1;
}
if(h==0)
{
printf("0 0\n");
return 0;//别忘记了,直接return,不再继续了;
}
else
{
for(int i=2002; i>=0; i--)
{
if(c[i]!=0)//一定是先判断非0之后再输出,不能是if(c[i]!=0&&g==0)
{
if(g==0)
{
printf("%d %d",c[i],i);
g=1;
}
else printf(" %d %d",c[i],i);
}
}
}
printf("\n");
return 0;
}
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n,m;
scanf("%d",&n);
int index,data;
for(int i=0; i<n; i++)
{
scanf("%d%d",&data,&index);
a[index]=data;
}
scanf("%d",&m);
for(int i=0; i<m; i++)
{
scanf("%d%d",&data,&index);
b[index]=data;
}
multiple();
add();
return 0;
}
注意:
(1)数组到底是要开多么大;
(2)如果是0 0的话,就直接返回,不再进行接下来的输出了;
(3)对于格式的控制方法;
2、一元多项式求导
设计函数求一元多项式的导数。
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
答案
#include <bits/stdc++.h>
int main()
{
int index,data;
int flag=0;
while(scanf("%d%d",&data,&index)!=EOF)
{
if(index!=0)
{
if(flag==0)
{
printf("%d %d",data*index,index-1);
flag=1;
}
else printf(" %d %d",data*index,index-1);
}
}
if(flag==0) printf("0 0\n");//这一句总是忘记;
return 0;
}
注意:
(1)不要忘记如果输入的指数全都是0的话应该怎么办。这个总是忘记;
3、求链式线性表的倒数第K项
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息NULL。
输入样例:
4 1 2 3 4 5 6 7 8 9 0 -1
输出样例:
7
答案1:(开一个足够大的数组)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[1000005];//注意数组一定要开的这么大,小一点都会错误;
int main()
{
int k; scanf("%d",&k);//倒数第k个数;
int n; scanf("%d",&n);//要存入的数;
int j=0;
while(n>=0)
{
a[j]=n;
scanf("%d",&n);
j++;
}
if(j-k<0) printf("NULL\n");
else printf("%d\n",a[j-k]);
return 0;
}
答案2:用容器做
#include <bits/stdc++.h>
using namespace std;
vector<int> p;
int main()
{
int n;
scanf("%d",&n);
int m;
int k=0;
while(scanf("%d",&m)&&m>=0)
{
p.push_back(m);
}
if(n>p.size())//这里别忘记了;
{
printf("NULL\n");
return 0;
}
while(k!=n-1)
{
p.pop_back();
k++;
}
printf("%d\n",p.back());
return 0;
}
注意:
(1)别忘记没有符合条件的数据的时候应该怎么输出;
(2)注意对于边界的控制;