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通过 | 12ms | 380kb | 1 | |
用例2通过 | 9ms | 252kb | 1 | |
用例3通过 | 10ms | 252kb | 1 | |
用例4通过 | 10ms | 252kb | 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
题目所给的数据保证了不会出现多个鞍点。
输入样例:
4
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通过 | 22ms | 252kb | 1 | |
用例2通过 | 10ms | 380kb | 1 | |
用例3通过 | 9ms | 256kb | 1 | |
用例4通过 | 11ms | 252kb | 1 | |
用例5通过 | 23ms | 380kb | 1 |
本次得分/总分:5.00/5.00分