程序设计入门——C语言 第7周编程练习

程序设计入门——C语言 第7周编程练习

1多项式加法(5分)
题目内容:

一个多项式可以表达为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

这道题如果是第一次见的话可能觉得很简单,随随便便写个40行的代码就上交,结果得了个0蛋。
主要可能错的地方有以下几个个:
1、输入幂次的系数为负时,中间要以-相连(鉴于负号和减号不是同一个运算符,所以我用的是减号,不知道负号能不能过检测)例如:输入了10 -2,9 -2,要输出-2x10-2x9。
2、系数为一或负一时前面的系数要省略,例如输入10 1,9 1时,输出应为x10+x9;而不是1x10+1x9。
3、幂次为一时幂次要省略,例如输入1 10时,输出应为10x,而非10x1。
4、第一项系数为正前边不需要带符号,但是为负时前边需要带减号。

由以上几个注意事项,可以把代码分成几块。
最后面有完整的代码。
第一部分,输入数据

#include<stdio.h>
#include<math.h>
int main()
{
	int x,y,max=0,a[101]={0};  //初始化数组,让里面的元素全为零
	for(int i=0;i<2;i++)  //两个多项式相加,要做两次输入。
	{
		do
		{
			scanf("%d %d",&x,&y);
			a[x] += y;
		}while(x!=0);  //最后一次输入的幂次为零,可以作为循环结束的条件。
	}

第二部分,寻找幂次最大项
这部分的目的主要是方便第一次输出(第一次输出前面不能带正号),不过会让后面的代码加多几个判断条件,但是我现在脑子一团浆糊也不想想其他更优解了。。

	for(int i=100;i>-1;i--)
	{
		if(a[i]!=0)
		{
			max = i;
			break;
		}
	}

第三部分,输出幂次最大项
首先要注意的是a[max]的大小,大于零和小于零,等于正负一和不等于正负一输出不同,要分开。
并且max等于零,等于一,等于其他数的输出也不一样,这里先输出不等于零的情况,其他的情况到后面再输出。

	if (a[max]>0&&max!=1&&max!=0)  //做一个判断,排除最大幂次为零或一的情况。
	{
		if(a[max]>1)             //系数为一和不为一的情况要分开输出。
		{
			printf("%dx%d",a[max],max);
		}
		else
		{
			printf("x%d",max);
		}
	}
	else if(a[max]<0&&max!=0&&max!=1)  //跟上面一样
	{
		a[max] = abs(a[max]);   //这是为了输出为减号而不是负号,这一步可能是不需要的。
		if(a[max]>1) //这里a[max]已经被换为正数了,不要惯性思维认为a[max]还是负数做一个负的判断
		{
			printf("-%dx%d",a[max],max);
		}
		else if(a[max]==1)
		{
			printf("-x%d",max);
		}
	}

第四部分,输出幂次小于max,但又大于1的其他项
这一部分和上面大同小异,只是不用考虑幂次为0或为1,但是还是要考虑系数绝对值是否等于1。

	for(int i=max-1;i>1;i--)     //幂次比max小,又比1大的遍历循环。
	{
		if(a[i]>0)          //只有系数不为零才能输出。
		{
			if(a[i]>1)
			{
				printf("+%dx%d",a[i],i);
			}
			else 
			{
				printf("+x%d",i);
			}
		}
		else if(a[i]<0)
		{
			a[i] = abs(a[i]);
			if(a[i]>1)
			{
				printf("-%dx%d",a[i],i);
			}
			else if(a[i]==1)
			{
				printf("-x%d",i);
			}
		}
	}

第五部分,输出幂次为一的项
如果这一项是负的,那么它前面一定要有减号,就不用考虑它是不是第一项了,但是如果它是正的,不是第一项的话前面要用加号链接,是第一项的话前面应该没有加号,所以在a[1]>0的情况要再判断一次。

	if(a[1]>0)  //系数为正的情况。
	{
		if(max!=1)  //不是第一项的情况。
		{
			if(a[1]>1)  //系数为一或为零。
			{
				printf("+%dx",a[1]);
			}
			else 
			{
				printf("+x");
			}
		}
		else if (max==1)  //a[1]是第一项的情况
		{
			if(a[1]>1)
			{
				printf("%dx",a[1]);
			}
			else 
			{
				printf("x");
			}
		}
	}
	else if(a[1]<0)
	{
		a[1] = abs(a[1]);
		if(a[1]>1)
		{
			printf("-%dx",a[1]);
		}
		else if (a[1]==1)
		{
			printf("-x");
		}
	}

最后一部分,输出幂次为零的项(常数项)
如果常数项不是第一项,则常数项为零时不必要输出它,但是常数项为第一项时,即使为零了也要把它输出。

	if(max==0)  //常数项为第一项的情况
	{
		if(a[0]>-1) //这里包含了常数项为零的情况
		{
			printf("%d",a[0]);
		}
		else if(a[0]<0)
		{
			a[0] = abs(a[0]);
			printf("-%d",a[0]);
		}
	}
	else if(max!=0)  //常数项不是第一项的情况
	{
		if(a[0]>0)  //这里就没包含常数项为零的情况
		{
			printf("+%d",a[0]);
		}
		else if(a[0]<0)
		{
			a[0] = abs(a[0]);
			printf("-%d",a[0]);
		}
	}
	return 0;
}

下面时完整版无注释的代码

#include<stdio.h>
#include<math.h>
int main()
{
	int x,y,max=0,a[101]={0};
	for(int i=0;i<2;i++)
	{
		do
		{
			scanf("%d %d",&x,&y);
			a[x] += y;
		}while(x!=0);
	}
	for(int i=100;i>-1;i--)
	{
		if(a[i]!=0)
		{
			max = i;
			break;
		}
	}
	if (a[max]>0&&max!=0&&max!=1)
	{
		if(a[max]>1)
		{
			printf("%dx%d",a[max],max);
		}
		else
		{
			printf("x%d",max);
		}
	}
	else if(a[max]<0&&max!=0&&max!=1)
	{
		a[max] = abs(a[max]);
		if(a[max]>1)
		{
			printf("-%dx%d",a[max],max);
		}
		else if(a[max]==1)
		{
			printf("-x%d",max);
		}
	}
	for(int i=max-1;i>1;i--)
	{
		if(a[i]>0)
		{
			if(a[i]>1)
			{
				printf("+%dx%d",a[i],i);
			}
			else 
			{
				printf("+x%d",i);
			}
		}
		else if(a[i]<0)
		{
			a[i] = abs(a[i]);
			if(a[i]>1)
			{
				printf("-%dx%d",a[i],i);
			}
			else if(a[i]==1)
			{
				printf("-x%d",i);
			}
		}
	}
	if(a[1]>0)
	{
		if(max!=1)
		{
			if(a[1]>1)
			{
				printf("+%dx",a[1]);
			}
			else 
			{
				printf("+x");
			}
		}
		else if (max==1)
		{
			if(a[1]>1)
			{
				printf("%dx",a[1]);
			}
			else 
			{
				printf("x");
			}
		}
	}
	else if(a[1]<0)
	{
		a[1] = abs(a[1]);
		if(a[1]>1)
		{
			printf("-%dx",a[1]);
		}
		else if (a[1]==1)
		{
			printf("-x");
		}
	}
	if(max==0)
	{
		if(a[0]>-1)
		{
			printf("%d",a[0]);
		}
		else if(a[0]<0)
		{
			a[0] = abs(a[0]);
			printf("-%d",a[0]);
		}
	}
	else if(max!=0)
	{
		if(a[0]>0)
		{
			printf("+%d",a[0]);
		}
		else if(a[0]<0)
		{
			a[0] = abs(a[0]);
			printf("-%d",a[0]);
		}
	}
	return 0;
}

其实这个代码写得确实挺烂,写这篇文章主要是给大家提醒下易错的地方,知道了那些易错点和大致流程大家都能写出更好的代码。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值