中国大学MOOC课程《程序设计入门——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

#include <stdio.h>

//程序要处理的幂最大为100,0次到100次总计101 
#define MAX_INDEX 101

int main()
{
    int a, b, i, maxIndex = 0;
    int polynomial[2][MAX_INDEX];
    //数组初始化
    for(i = 0; i < MAX_INDEX; i++){
        polynomial[0][i] = 0;
        polynomial[1][i] = 0;
    }
    //获取输入数据
    for (i = 0; i < 2; i++) {
    	scanf("%d %d", &a, &b);
    	polynomial[i][a] = b;
    	//获取输入的多项式最高次幂 ,由题目要求可知第一行肯定是最高次幂 
    	//获取这个主要是为了后面的系数相加时尽可能的减少遍历次数,如果没有这个,那么我们需要多这0-100幂都进行遍历 
    	if(a > maxIndex) maxIndex = a;
    	while(a != 0){
    		scanf("%d %d", &a, &b);
    		//题目中也没有说明是否会出现同一次幂次输入两次,所以在此考虑上,如果输入两次,则两次系数相加
    		polynomial[i][a] += b; 
    		//如果同一个幂次输入多次,需要以最后一次为准的话(后面的覆盖前面的输入),则需要去掉+号 
    		//polynomial[i][a] = b; 
		}
    }
    //如果输入的多项式最高幂大于100,例如输入幂次101,此时它的系数在 polynomial中是没有的
	//或者说这已经数组下标越界了,编译器不会报错,会返回一个意想不到的数据 
    maxIndex = maxIndex > MAX_INDEX - 1?MAX_INDEX - 1:maxIndex;
    //printf("输入的多项式最高次为:%d", maxIndex);
    
    //对两个多项式对应幂的系数相加并输出,除了零次幂和一次幂 
    int flag = 0;
    for(i = maxIndex; i > 1;i--){
    	int temp = polynomial[0][i] + polynomial[1][i];
    	if(temp != 0){
    		// 当系数大于0的时候前面需要输出+号,除了最高次幂 
    		if(flag == 1 && temp>0){
    			printf("+");
			}
			flag = 1;
			//除了零次幂,其他幂的系数为1时不需要输出1 
			//系数大于1时 
    		if(abs(temp)>1){
    			printf("%dx%d",temp, i);
			}else if(temp == 1){
				printf("x%d",i);
			}else{
				printf("-x%d", i);
			}		
		}
    }
    //对两个多项式零次幂和一次幂 的系数相加并输出
    int temp_0 = polynomial[0][0]+ polynomial[1][0];
    int temp_1 = polynomial[0][1]+ polynomial[1][1];
    if(temp_1!=0){
    	if(flag == 1 && temp_1>0){
    		printf("+");
		}
		flag = 1;
    	if(abs(temp_1) >1){
    		printf("%dx", temp_1);
		}else if(temp_1== 1){
			printf("x");
		}else{
			printf("-x");
		} 			
	}
	// 零次幂系数为零是也需要输出
	if(flag){
		printf("+");
	}
	//零次幂的系数即使是0,也需要输出 
	printf("%d",temp_0);
    return 0;
}

 

用例测试结果运行时间占用内存提示得分
用例1通过12ms380kb 1
用例2通过9ms252kb 1
用例3通过10ms252kb 1
用例4通过10ms252kb 2

提交答案

本次得分/总分:5.00/5.00分

 

 

2

鞍点(5分)

题目内容:

给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数。一个矩阵A也可能没有鞍点。

你的任务是找出A的鞍点。

 

 

 

输入格式:

输入的第1行是一个正整数n, (1<=n<=100),然后有n行,每一行有n个整数,同一行上两个整数之间有一个或多个空格。

 

输出格式:

对输入的矩阵,如果找到鞍点,就输出其下标。下标为两个数字,第一个数字是行号,第二个数字是列号,均从0开始计数。

如果找不到,就输出

NO

题目所给的数据保证了不会出现多个鞍点。

 

输入样例:

1 7 4 1 

4 8 3 6 

1 6 1 2 

0 7 8 9

 

输出样例:

2 1

时间限制:500ms内存限制:32000kb

#include<stdio.h>

int main()
{
    int n, i, j;
    scanf("%d", &n);
    int matrix[n][n];
    //下面的数组用于保存矩阵每行的最大值/每列的最小值
    int max_value[n], min_value[n];
    //鞍点的下标
    int saddle_point_x = -1, saddle_point_y = -1;
    
    //数据初始化 
    for(i = 0;i < n; i++){
        //max_value数组不建议初始化为0(矩阵元素为负值时),因为这保存的是最大值,应初始化为一个较小的值
        max_value[i] = -32768;
        //min_value数组不能初始化为0,因为这保存的是最小值,应初始化为一个很大的值
        min_value[i] = 32767;
        for(j = 0; j< n; j++){
            scanf("%d", &matrix[i][j]);
        }
    }
    // printf("输入的矩阵是:");
    // for(i = 0;i < n; i++){
    //     printf("\n");
    //     for(j = 0; j< n; j++){
    //         printf("%d\t", matrix[i][j]);
    //     }
    // }
    
    for(i = 0;i < n; i++){
        for(j = 0; j< n; j++){
            //每行的最大值
            if(matrix[i][j]  > max_value[i]){
                max_value[i] = matrix[i][j];
            }
            //每列的最小值
            if(matrix[j][i] < min_value[i]){
                min_value[i] = matrix[j][i];
            }
        }
    }
    //当两个数组中有元素数值相等时,获取它们的下标
    for(i = 0;i < n; i++){
        for(j = 0; j< n; j++){
            if(max_value[i] == min_value[j]){
                saddle_point_x = i;
                saddle_point_y = j;
                break;
            }
        }
    }
    if(saddle_point_x != -1){
        printf("%d %d", saddle_point_x, saddle_point_y);
    }else{
        printf("NO");
    }
    return 0;
} 
用例测试结果运行时间占用内存提示得分
用例1通过22ms252kb 1
用例2通过10ms380kb 1
用例3通过9ms256kb 1
用例4通过11ms252kb 1
用例5通过23ms380kb 1

提交答案

本次得分/总分:5.00/5.00分

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
北邮大学MOOC信号与系统第七期期末考试是一个旨在测试学生对信号与系统基本概念和应用的理解和掌握程度的考试。 这个期末考试通常由选择题和计算题组成。选择题旨在了解学生对于信号与系统的基本概念和理论的理解程度,涵盖了信号与系统的定义、分类、特性、连续与离散信号等。计算题则要求学生能够运用所学的数学方法和信号与系统的理论知识解决实际问题,例如频域分析、卷积等。 为了准备好这个期末考试,学生可以通过复习课堂上的知识点,观看已录制的课程视频,做课后习题,参考教材等来加深对于概念和理论的理解。此外,还可以参加复习班、进行小组讨论等方式来互相学习和分享经验。 考试之前,学生可以通过做一些模拟题来熟悉考试的形式,回顾复习内容,并查漏补缺。 在考试过程中,学生需要阅读题目认真,理解题目要求,并合理安排答题时间。在做计算题时,注意理清思路,正确运用公式和方法进行计算。在做选择题时,细心阅读选项,进行仔细比较和分析,并选择最合适的答案。 总的来说,北邮大学MOOC信号与系统第七期期末考试是一个对学生在信号与系统方面知识和能力的综合考察,通过对基础概念和理论的掌握以及实际应用能力的考查,帮助学生检验对于该学科的理解情况,同时也促使学生加深对信号与系统的认识和理解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值