2019年10月25日实验题目题解(入门)

直接上题解吧,难度一般

A题输出连续的整数序列 之一

题目描述
输出指定区间内的所有整数。
输入
输入只有1行,即N,N是一个int类型的数据。
输出
如果N>0,则输出[1,N]区间内的所有整数;如果N =0,则输出0;如果N<0,则输出[N,-1]内的所有整数。
如果输出的整数多于1个,则两两之间用一个空格隔开。
样例输入
9
样例输出
2 3 4 5 6 7 8 9
标程

#include<stdio.h>

int main(){
    int N,i;
    scanf("%d",&N);
    if(N>0){
        for(i=1;i<=N;++i){
            printf("%d",i);
            if(i!=N){
                printf(" ");
            }
        }
    }
    else if(N==0){
        printf("0");
    }
    else{
        for(i=N;i<=-1;++i){
            printf("%d",i);
            if(i!=-1){
                printf(" ");
            }
        }
    }
    return 0;
}

分三种情况分别是N>0,N=0,N<0这三种情况
而这三种情况题目中已经说明了,就是三个判断和两个循环就可以了
标程也很好理解

B题输出连续的整数序列 之二
Description
输出若干个连续的整数序列。
Input
输入有多行。第一行是N>0,表示后面有N行输入。
之后每行输入包含2个数据P和Q,两者之间用空格隔开,且均在int类型的表示范围内。
Output
输出N个连续的整数序列,序列两两之间用一个空行隔开。
其中第i个序列是在P和Q之间的整数,包括P和Q,且当输出的数据多于1个时,两两之间用一个空格隔开。
Sample Input
3
1 100
10 -10
10 10
Sample Output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10

10
HINT
当P或Q是int类型的能够表示的最大值或者最小值时,应该如何处理?
标程

#include<stdio.h>

int main(){
    int z,x,i,N,temp,j;
    scanf("%d",&N);
    for(j=0;j<N;++j){
        scanf("%d%d",&z,&x);
        if(z>x){
            temp=z,z=x,x=temp;
        }
        for(i=z;i<x;++i){
            printf("%d ",i);
        }
        printf("%d\n",x);
        printf("\n");
    }
    return 0;
}

这道题给了提示

当P或Q是int类型的能够表示的最大值或者最小值时,应该如何处理?

我做题的时候没有关注到这个点,或者说看到了这个点,并没有意识到用处,挂了三四遍,才大概反应过来,这里的意思就是说可能数据会存在溢出的情况,这样会导致WA(我在实验室WA的一下就哭出来了 )。
怎么处理呢,只需要将最后一个书单独输出就好了。(qwq)

C题求累加和

Description
编程求min~max的累加和(含min和max),其中max>=min>0。
Input
输入为多行。第一行是一个整数N>0,表示后面有N个测试用例。后面有N行,每行包含2个整数,分别是min和max。
Output
输出为N行,每个测试用例的计算结果占据一行。每行的格式为:
case i:sum=s.
其中i表示测试用例的编号(从1开始),s是该测试用例对应的累加和(设不超过int的表示范围)。
Sample Input
2
1 10
1 100
Sample Output
case 1:sum=55.
case 2:sum=5050.
标程

#include<stdio.h>

int main(){
    int N,i,j,sum,a,b;
    scanf("%d",&N);
    for(i=0;i<N;++i){
    	scanf("%d%d",&a,&b);
    	sum=0;
    	for(j=a;j<=b;++j){
    		sum+=j;
		}
		printf("case %d:sum=%d.\n",i+1,sum);
	}
    return 0;
}

这道题和之前基本是一道,就是这个多组数据并且有了简单的格式,这样的话,其实两层循环嵌套就行了。这个很简单比较水

D题奇怪的求和 之二

Description
给定若干个非负整数,按照如下规则求和:
如果这个数字是偶数,则累加到和中;
如果这个数字是奇数,则将大于该数的最小偶数累加到和中。
Input
输入分为多行。第一行是一个整数M>0,表示后面有M个测试用例。
之后有M行,每一行第一个非负整数N<=100表明这行会有N个非负整数需要累加。
假定:每个测试用例的累加和不会超出int类型的表示范围。
Output
输出有M行,输入中的每个测试用例对应一行输出,每行的格式如下:
case #: ?
其中#表示测试用例编号,?表示该测试用例的计算结果。
Sample Input
4
5 1 2 3 4 5
5 1 1 3 3 5
1 1
0
Sample Output
Case 1: 18
Case 2: 18
Case 3: 2
Case 4: 0
标程

#include<stdio.h>

int main(){
	//freopen("test.txt","r",stdin);
    int N,i,j,sum,m,num;
    scanf("%d",&N);
    for(i=0;i<N;++i){
    	scanf("%d",&m);
    	sum=0;
    	for(j=0;j<m;++j){
    		scanf("%d",&num);
    		if(num%2==0){
    			sum+=num;
			}
			else{
				sum+=num+1;
			}
		}
		printf("Case %d: %d\n",i+1,sum);
	}
    return 0;
}

同样和之前的题几乎如出一辙,就是多了一个数据组数只需要将偶数直接加上,奇数加一求和就行了,求和后按格式输出就行了

E题笛卡尔平面

Description
在数学里,笛卡儿坐标系(Cartesian坐标系),也称直角坐标系,是一种正交坐标系。二维的直角坐标系是由两条相互垂直、0 点重合的数轴构成的。在平面内,任何一点的坐标 是根据数轴上对应的点的坐标设定的。
二维的直角坐标系通常由两个互相垂直的坐标轴设定,通常分别称为 x-轴 和 y-轴;两个坐标轴的相交点,称为原点,通常标记为 O ,既有“零”的意思,又是英语“Origin”的首字母。每一个轴都指向一个特定的方向。这两个不同线的坐标轴,决定了一个平面,称为 xy-平面,又称为笛卡儿平面。
以笛卡尔平面上一个点的坐标(x,y)坐标为输入,输出该点是否在坐标轴上或者位于哪一个象限。
Input
输入为一行。输入的坐标x、y值都会带有1位小数,括号和逗号都是英文半角符号,逗号后面有一个空格。
Output
四个象限输出为“quadrand I”、“quadrand II”、“quadrand III”、“quadrand IV”,x-轴和y-轴输出为“x axis”和“y axis”,原点输出为“origin”
输出为以下三种:
(-1.0, -2.5) is in quadrand III
(0.0, 4.8) is on the y axis
(0.0, 0.0) is origin
Sample Input
(-1.0, -2.5)
Sample Output
(-1.0, -2.5) is in quadrand III
标程

#include<stdio.h> 

int main(){ 
    float a,b; 
    scanf("(%f, %f)",&a,&b); 
    if(a>0 && b>0){
    	printf("(%.1f, %.1f) is in quadrand I",a,b); 
	}    
    if(a>0 && b<0){
    	printf("(%.1f, %.1f) is in quadrand IV",a,b); 
	}   
    if(a<0 && b>0){
    	printf("(%.1f, %.1f) is in quadrand II",a,b);
	} 
    if(a<0 && b<0){
    	printf("(%.1f, %.1f) is in quadrand III",a,b);
	}
    if(a==0 && b!=0){
    	printf("(%.1f, %.1f) is on the y axis",a,b); 
	} 
    if(b==0 && a!=0){
    	printf("(%.1f, %.1f) is on the x axis",a,b); 
	}
    if(a==0 && b==0){
    	printf("(%.1f, %.1f) is origin",a,b); 
	}
    return 0; 
}

思路相当简单,但是七个大判断真的很烦啊(抱头嘤嘤嘤
其实没必要在写出具体的思路,直接堆判断按照格式输出就行了,输出的地方复制一下改就行,别手敲容易敲错

F题编写函数:求三个整数的最大值 (Append Code)

Description
求三个整数的最大值。
编写一个函数maxValue()求三个整数的最大值。其原型为:
int maxValue(int a,int b,int c);
功能:函数的三个参数传入a,b,c的值,返回其中最大值。
函数的调用格式见“Append Code”。
Input
输入三个int类型的整数,两两之间用空格隔开。
Output
输出三个整数的最大值。
Sample Input
1 2 3
Sample Output
3
标程

#include<stdio.h> 

int maxValue(int a,int b,int c){
	a=a>b?a:b;
	return a>c?a:c;
}

这是一道Special Judge的题目只需要提交头文件和函数就行了,主函数部分题目上也有

int main()
{
    int x, y, z;
    scanf("%d %d %d", &x, &y, &z);
    printf("%d", maxValue(x, y, z));
    return 0;
}

完全函数

#include<stdio.h> 

int maxValue(int a,int b,int c){
	a=a>b?a:b;
	return a>c?a:c;
}


int main()
{
    int x, y, z;
    scanf("%d %d %d", &x, &y, &z);
    printf("%d", maxValue(x, y, z));
    return 0;
}

本地跑一遍就行了
关键函数就是判断最大值的函数,方法有很多种我这里采用了三目运算符两次使用三目运算符就能解决了
注意函数匹配,能跑过就行
提供一些其他的思路
1.三目运算符
2.数组保存,循环扫一遍一旦大于就更改
3.大判断,一堆判断往上怼
4.STL库
5.自带的max(a,b)的函数
还有几种奇妙的骚操作在这里就暂时不介绍了,之后的文章中会逐渐介绍的。

最近新开通了公众号,在里面会更新一些学习笔记,题解,欢迎大家来参观

Orz

嘿嘿嘿

发布了41 篇原创文章 · 获赞 58 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/a1351937368/article/details/102747543