MOOC《程序设计入门——C语言》翁恺 第七周 7.1编程练习答案及笔记

MOOC《程序设计入门——C语言》翁恺 第七周 7.1编程练习答案及笔记


花了好长时间才把4个用例都通过,期间还搜了大佬们的代码参考,所以要好好的做下笔记整理整理。

7.1题目

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

根据题目而知:

  1. 需要输入两次多项式,两次输入都以次幂为0结束。
  2. 次幂最大为100。
  3. 当次幂不为0,系数为0,不输出。
  4. 当次幂为0,且系数为0,则要输出0。
  5. 两个多项式,若有相同的次幂,则它们的系数要相加。
  6. 输出顺序是开头必须次幂最大,结尾次幂必须为0,首尾之间的顺序无所谓。

另外,还要注意

  1. 系数有负数的情况。
  2. 当系数为1或-1时,它的系数不输出,若为-1则x前有负号。

分开说明代码

注意!!!在代码里用flag来判断是否执行if语句去在后面添加“+”,所以有两种形式。
主要是根据在哪定义flag变量来形成两种形式

定义变量及输入

形式一:
在for循环外定义flag=0

	int num[101] = {0};//初始化为0,因为次幂最大为100,所以在让下标作为次幂时,要把num[100]这个元素包括进去,所以数组长度101
    int a, b;
    int j = 2;
    int i;
    int flag = 0;//-----------------------------形式一-----------------------------
    for (; j > 0; j--)//循环两次输入多项式
    {
        do
        {
            scanf("%d %d", &a, &b);
            num[a] += b;    //用下标作为次幂,数组num的元素的值作为系数。当两次输入多项式有相同的次幂时,让系数相加
        } while (a != 0);
    }

形式二:

int num[101] = {0};//初始化为0,因为次幂最大为100,所以在让下标作为次幂时,要把num[100]这个元素包括进去,所以数组长度101
int a, b;
int j = 2;
int i;
//int flag = 0;-----------------------------形式二,不在这定义该变量-----------------------------
for (; j > 0; j--)//循环两次输入多项式
{
    do
    {
        scanf("%d %d", &a, &b);
        num[a] += b;    //用下标作为次幂,数组num的元素的值作为系数。当两次输入多项式有相同的次幂时,让系数相加
    } while (a != 0);
}

遍历num数组,判断条件输出语句

形式一:

for (i = 100; i >= 0; i--)//遍历数组,从大到小
{
    if (num[i] > 1 || num[i] < -1)//当系数不为0或1、-1时
    {
        if (i == 0)//次幂为0
        {
            printf("%d", num[i]);//注意这里没有flag的判断
        }
        else if (i == 1)//次幂为1
        {
            printf("%dx", num[i]);
            flag = 1;
        }
        else if (i > 1)//次幂大于1
        {
            printf("%dx%d", num[i], i);
            flag = 1;
        }
    }
    else if (num[i] == 1)//当系数为1,则要注意系数±1的绝对值不显示
    {
        if (i == 0)//次幂为0
        {
            printf("1");//注意这里没有flag的判断
        }
        else if (i == 1)//次幂为1
        {
            printf("x");
            flag = 1;
        }
        else if (i > 1)//次幂大于1
        {
            printf("x%d", i);
            flag = 1;
        }
    }
    else if (num[i] == -1)//当系数为-1,则要注意系数±1的绝对值不显示
    {
        if (i == 0)//次幂为0
        {
            printf("-1");//注意这里没有flag的判断
        }
        else if (i == 1)//次幂为1
        {
            printf("-x");
            flag = 1;
        }
        else if (i > 1)//次幂大于1
        {
            printf("-x%d", i);
            flag = 1;
        }
    }
    else if (num[i] == 0 && i == 0)//当次幂和系数都为0,要输出0
    {   
    	//-----------------------形式一,添加if(flag)-----------------------------
        if(flag){//当0次幂前有系数不为0的次幂,则在前加上+号(因为是次幂从大到小输出,当0次幂前的所有次幂的系数都为0,则flag没变过还是为0)
            printf("+");
        }
        printf("0");//输出为0
    }

形式二:
在for循环里定义flag=0

for (i = 100; i >= 0; i--)//遍历数组,从大到小
{
	int flag=0;	//-----------------------形式二,每次遍历数组都把flag变为0-----------------------
    if (num[i] > 1 || num[i] < -1)//当系数不为0或1、-1时
    {
        if (i == 0)//次幂为0
        {
            printf("%d", num[i]);//注意这里没有flag的判断
        }
        else if (i == 1)//次幂为1
        {
            printf("%dx", num[i]);
            flag = 1;
        }
        else if (i > 1)//次幂大于1
        {
            printf("%dx%d", num[i], i);
            flag = 1;
        }
    }
    else if (num[i] == 1)//当系数为1,则要注意系数±1的绝对值不显示
    {
        if (i == 0)//次幂为0
        {
            printf("1");
        }
        else if (i == 1)//次幂为1
        {
            printf("x");
            flag = 1;
        }
        else if (i > 1)//次幂大于1
        {
            printf("x%d", i);
            flag = 1;
        }
    }
    else if (num[i] == -1)//当系数为-1,则要注意系数±1的绝对值不显示
    {
        if (i == 0)//次幂为0
        {
            printf("-1");
        }
        else if (i == 1)//次幂为1
        {
            printf("-x");
            flag = 1;
        }
        else if (i > 1)//次幂大于1
        {
            printf("-x%d", i);
            flag = 1;
        }
    }
    else if (num[i] == 0 && i == 0)//当次幂和系数都为0,要输出0
    {   
    //----------------形式二,没有了形式一的另外判断次幂和系数为0时前面是否需要加上加号-------------
        printf("0");//输出为0
    }

在后面添加“+”号

注意该代码是在遍历数组for循环里的最后
形式一:
(在这个判断语句里,当前次幂 i 的下一个次幂的系数num[ i ]为负数时,当前次幂的后面不添加"+"号,也就是要判断下一个系数是否为负数;还要注意不能为0,因为,当某个不为0次幂的系数为0时num[ i ]=0也就是说,如果num[ i-1 ]>=0的话,会把该不会显示出来的数后面添加个“+”号,如下图所示。)

当num[ i-1 ] >= 0
还要注意,因为在形式一里,flag是定义到遍历数组for外边的,当有一个次幂不为0且系数不为0,则flag会变为1,之后直到遍历到次幂为0,flag仍旧为1。这就是为什么在形式一里,当次幂和系数为0时,可以用flag来判断前面是否有次幂系数不为0的数,以此来判断是否需要在前加上“+”号。

if (flag && num[i - 1] > 0)//当flag为1且该次幂的下一个次幂的系数不为0和负数,在后面加上+号
{                                                              
    printf("+");
}

形式二:
因为在形式二里,flag是在for循环里定义的,所有不用像形式一那样担心输出次幂不为0系数为0的多余加号了

if (flag && num[i - 1] >= 0)//当flag为1且该次幂的下一个次幂的系数不为0和负数,在后面加上+号
{                                                              
    printf("+");
}

全部代码

形式一:

#include <stdio.h>
int main()
{
    int num[101] = {0};//初始化为0,因为次幂最大为100,所以在让下标作为次幂时,要把num[100]这个元素包括进去,所以数组长度101
    int a, b;
    int j = 2;
    int i;
    int flag = 0;
    for (; j > 0; j--)//循环两次输入多项式
    {
        do
        {
            scanf("%d %d", &a, &b);
            num[a] += b;    //用下标作为次幂,数组num的元素的值作为系数。当两次输入多项式有相同的次幂时,让系数相加
        } while (a != 0);
    }
    for (i = 100; i >= 0; i--)//遍历数组,从大到小
    {
        if (num[i] > 1 || num[i] < -1)//当系数不为0或1、-1时
        {
            if (i == 0)//次幂为0
            {
                printf("%d", num[i]);
            }
            else if (i == 1)//次幂为1
            {
                printf("%dx", num[i]);
                flag = 1;
            }
            else if (i > 1)//次幂大于1
            {
                printf("%dx%d", num[i], i);
                flag = 1;
            }
        }
        else if (num[i] == 1)//当系数为1,则要注意系数±1的绝对值不显示
        {
            if (i == 0)//次幂为0
            {
                printf("1");
            }
            else if (i == 1)//次幂为1
            {
                printf("x");
                flag = 1;
            }
            else if (i > 1)//次幂大于1
            {
                printf("x%d", i);
                flag = 1;
            }
        }
        else if (num[i] == -1)//当系数为-1,则要注意系数±1的绝对值不显示
        {
            if (i == 0)//次幂为0
            {
                printf("-1");
            }
            else if (i == 1)//次幂为1
            {
                printf("-x");
                flag = 1;
            }
            else if (i > 1)//次幂大于1
            {
                printf("-x%d", i);
                flag = 1;
            }
        }
        else if (num[i] == 0 && i == 0)//当次幂和系数都为0,要输出0
        {   
            if(flag){//当0次幂前有系数不为0的次幂,则在前加上+号(因为是次幂从大到小输出,当0次幂前的所有次幂的系数都为0,则flag默认为0)
            	printf("+");
            }
            printf("0");
        }
        if (flag && num[i - 1] > 0)//当flag为1且该次幂的下一个次幂的系数不为0和负数,在后面加上+号
        {      //---------------第一种①num[i-1]>0----------------第二种②num[i-1]>=0
            printf("+");
        }
    }
    return 0;
}

形式二:

#include <stdio.h>
int main()
{
    int num[101] = {0};//初始化为0,因为次幂最大为100,所以在让下标作为次幂时,要把num[100]这个元素包括进去,所以数组长度101
    int a, b;
    int j = 2;
    int i;
    for (; j > 0; j--)//循环两次输入多项式
    {
        do
        {
            scanf("%d %d", &a, &b);
            num[a] += b;    //用下标作为次幂,数组num的元素的值作为系数。当两次输入多项式有相同的次幂时,让系数相加
        } while (a != 0);
    }
    for (i = 100; i >= 0; i--)//遍历数组,从大到小
    {
        int flag = 0;//---------------------------------------------------第二种②
        if (num[i] > 1 || num[i] < -1)//当系数不为0或1、-1时
        {
            if (i == 0)//次幂为0
            {
                printf("%d", num[i]);
            }
            else if (i == 1)//次幂为1
            {
                printf("%dx", num[i]);
                flag = 1;
            }
            else if (i > 1)//次幂大于1
            {
                printf("%dx%d", num[i], i);
                flag = 1;
            }
        }
        else if (num[i] == 1)//当系数为1,则要注意系数±1的绝对值不显示
        {
            if (i == 0)//次幂为0
            {
                printf("1");
            }
            else if (i == 1)//次幂为1
            {
                printf("x");
                flag = 1;
            }
            else if (i > 1)//次幂大于1
            {
                printf("x%d", i);
                flag = 1;
            }
        }
        else if (num[i] == -1)//当系数为-1,则要注意系数±1的绝对值不显示
        {
            if (i == 0)//次幂为0
            {
                printf("-1");
            }
            else if (i == 1)//次幂为1
            {
                printf("-x");
                flag = 1;
            }
            else if (i > 1)//次幂大于1
            {
                printf("-x%d", i);
                flag = 1;
            }
        }
        else if (num[i] == 0 && i == 0)//当次幂和系数都为0,要输出0
        {   
            printf("0");
        }
        if (flag && num[i - 1] >= 0)//当flag为1且该次幂的下一个次幂的系数不为0和负数,在后面加上+号
        {     //---------------第一种①num[i-1]>0----------------第二种②num[i-1]>=0
            printf("+");
        }
    }
    return 0;
}
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值