XDOJ2019期末试题第三组

本文介绍了四个编程题目:一元二次方程求解,根据特定规则生成密码,计算多个正整数的最大公约数之和,查找矩阵中行最大列最小的元素,以及根据缺勤和作业完成情况确定禁考名单。每个题目的输入输出格式、示例和解题思路都有详细说明。
摘要由CSDN通过智能技术生成

一元二次方程的解

试题名称 1-3 一元二次方程的解
问题描述
一元二次方程的两个根为:

其解的情况与判别式的值有关:
•当,则方程有两个不相等的根;
•当,则方程有两个相等的根;
•当,则方程无实数根。
输入说明
输入三个整数 a,b,c()表示一元二次方程的三个系数,以空格分割。
输出说明
当方程有两个相等的根时,输出这个值;当方程有两个不相等根时输出两个根的平方和;当方程无实数根时输出“No real roots”。所有结果只保留整数部分(向下取整,即小数部分丢弃)。
测试样例
输入样例 1
1 -4 4
输出样例 1
2
输入样例 2
2 -7 6
输出样例2
6
输入样例3
-1 3 3
输出样例 3
15
输入样例4
10 1 10
输出样例 4
No real roots

#include <stdio.h>
#include <math.h>
int main(){
	float a,b,c;
	scanf("%f %f %f",&a,&b,&c);
	float t;
	t = b*b-4*a*c;
	float result1 = (-b+sqrt(t))/2*a;
	float result2 = (-b-sqrt(t))/2*a;
	if(t==0){
		printf("%.0f",result1);
	}else if(t>0){
		printf("%.0f",result1*result1+result2*result2);
	}else printf("No real roots");
	return 0;
}

密码生成

**试题名称	2-3密码生成
问题描述	
输入一个含字母、数字、空格和其它字符的字符串,完成密码生成,密码算法如下:
1.) 大写字母转换为小写字母如'Y'转换为小写字母为’y’;
2.) 小写字母转换为大写字母,'b'转换为大写字母为’B’
3.) 数字字符转换为其数值+2后的数字字符,如果+2后值大于等于10,则去掉十位,仅记录个位数字,如原字符为'9',其数字值为9+2后变为11,大于10,取其个位数字1,转换为'1'4.) 空格字符转换为'#'字符;
输入一串字符(长度小于20,试编程将该字符串转换为密码并输出。

输入说明
输入一串字符(长度小于20)。

输出说明
按要求的格式输出处理结果:处理后的密码

测试样例:
	输入样例1
abcyz *& AZ
输出样例1
ABC#YZ#*&#az
输入样例2
kQ37 &*END
	输出样例2
Kq59#&*end
输入样例3
28*& (abc YZD
	输出样例3
40*&#(ABC#yzd
**
#include <stdio.h>
int main(){
	char s[20];
	int i=0;
	gets(s);
	for(i=0;s[i]!='\0';i++){
		if(s[i]>='a'&&s[i]<='z'){
			s[i] = s[i]-32;
		}else if(s[i]>='A'&&s[i]<='Z'){
			s[i] = s[i]+32;
		}else if(s[i]>='0'&&s[i]<='9'){
			int t;
			t=s[i]-'0'+2;
			if(t<10){
				s[i]= t+'0';
			}else if(t>=10){
				s[i] = t%10+'0';
			}
		}else if(s[i]==' '){
			s[i]='#';
		}
	}

	printf("\n%s",s);
	return 0;
}

最大公约数求和

试题名称	3-3 最大公约数求和
问题描述	
对于n个正整数,分别求两相邻整数的最大公约数,得到n-1个值,然后求这n-1个值的和。
如给定n=4个整数2865,则相邻整数为(2,8),(8,6),(6,5),这三组数的最大公约数分别为221,所以最终输出5。

输入说明
输入分两行:
第一行为一个正整数n,1<n<100;
第二行为n个正整数,每个整数绝对值都小于215,整数之间以空格分隔.

输出说明
输出一行,为最大公约数的和,输出后换行。

测试样例:
	输入样例1
4
2865
输出样例1
5

输入样例2
6
512841
	输出样例2
9
#include <stdio.h>
int main(){
     int i = 0,n,sum = 0;
	 scanf("%d",&n);
	 int a[100];
	 	 for(i=0;i<n;i++){
           scanf("%d",&a[i]);
	 }	
	 int t,m;
	 for(i=0;i<n-1;i++){
	 		t = a[i+1];
          	m = a[i];
			  while(t!=0){
		     int q;
			q= m%t;
		     m=t;
	     	t = q;
	}
	 	sum = sum+m;
	 }	
	 printf("%d",sum);
	return 0;
}

查找矩阵元素

4-3查找矩阵元素
问题描述	
找出一个m×n的矩阵中,在行上最大而在列上最小的元素,输出它的位置。

输入说明
共输入M+1行,第一行给出矩阵A的行数和列数(0<m、n <50),用空格分隔,以下m行,每行输入该行的n个元素,用空格分隔。矩阵所有元素各不相同。

输出说明
按行优先的顺序分行输出所有该类元素的行号、列号(行号和列号从1开始计数)及元素的值(用一个空格分隔),之后换行。如果不存在,输出”not exist”。

测试样例:
	输入样例1
3 3 
1 5 6
7 9 27
5 11 35
输出样例1
1 3 6
输入样例2
3 2
35 27
-12 9
20 0
输出样例2
not exist
#include <stdio.h>
int main(){
	int m,n;
	scanf("%d %d",&m,&n);
	int a[50][50],i = 0,j=0;
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	int flag = 0;
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			int t=a[i][j];
			int max = t,min = t;
			for(int l=0;l<n;l++){
				if(a[i][l]>max) max = a[i][l];
			}
			for(int r=0;r<m;r++){
				if(a[r][j]<min) min = a[r][j];
			}
			if(max==t&&min==t){
				printf("%d %d %d\n",i+1,j+1,a[i][j]);
				flag = 1;
			}
		}
	}
	if(flag==0){
		printf("not exist");
	}
	return 0;
}

禁考名单

在这里插入代码片试题名称	5-3禁考名单
问题描述	
期末考试前,每门课程需按培养过程要求确定不能参加考试的学生名单。
给定N个学生的信息,包括学号(整数)、总课次数、到课次数和完成作业次数([0,48]区间内的整数),每次课对应一次应完成作业。要求输出禁考学生的总数和学号。
禁考规则:学生缺课次数达到(≥)总课程次数的四分之一,且完成作业次数不足(<)总次数的二分之一。

输入格式:
在一行中给出正整数N(0<N≤10)。随后N行,每行给出一名学生的学号、总课次数、到课次数和完成作业次数,中间以空格分隔。输入保证学号有序。

输出格式:
第一行输出禁考学生人数,后面每行输出一名禁考学生的学号。输出的学号顺序与输入时的学号次序相同;禁考人数为0时,输出”No”。

测试样例:
输入样例13
10001 48 46 48
10002 32 16 15
10003 40 30 18

输出样例12
10002
10003

输入样例23
10001 48 46 48
10002 32 18 18
10003 40 30 28

输出样例2:
No

#include <stdio.h>
struct Student{
	int num;
	int all;
	int com;
	int fin;
}stu[100];
int main(){
    int i = 0,n,count = 0;;
    scanf("%d",&n);
    for(i=0;i<n;i++){
    	scanf("%d %d %d %d",&stu[i].num,&stu[i].all,&stu[i].com,&stu[i].fin);
	}
	int b[100];
	for(i=0;i<n;i++){
			int t = stu[i].all;
		if(stu[i].com<=3*t/4&&stu[i].fin<0.5*t){
		b[count]=stu[i].num;
		count++;
		}
	}
	if(count==0){
		printf("No");
	}else{
		printf("%d\n",count);
		for(i=0;i<count;i++){
			printf("%d\n",b[i]);
		}
	}
	return 0;
}

码字不易,给个👍~我们下一篇博客见!

才疏学浅,个人理解难免有错,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值