第三届传智杯模拟赛题解

A

题目描述
给出一个正整数 n,请你计算从 1 到 n 的所有正整数中,有多少个数字的各位数和是 9?

输入格式
输入一个不超过 1000000的正整数 nn。

输出格式
输出一个整数表示答案

输入输出样例
输入
50
输出
5
说明/提示
1 到 50 的所有整数中,有 9,18,27,36,45 这 5 个数字符合要求。

题目链接

#include  

using namespace std;

int main(){
     
	int n;
	scanf("%d",&n);
	int count = 0;
	do{
     
		int sum = 0;
		int i = n;
		while(i){
     
			int k = i % 10;
			i /= 10;
			sum += k; 
		}
		if(sum == 9) count++;
	}while(n--);
	printf("%d\n",count);
	
	return 0;
}

B

题目描述
一个直角三角形的两个直角边是 a,b(a≤b),其斜边是 c,且 a,b,c都是正整数。

现在我们已经知道了斜边长度 c,请问这个直角三角形的两个直角边的长度是什么?

输入格式
输入一个整数 c(1<=c <=1.41*104)。

输出格式
输出两个整数 a,b表示答案。保证有整数解。如果有多个可能的答案,请确保 aa 尽可能的小。

输入输出样例
输入 #1复制
5
输出 #1复制
3 4
题目链接

#include 

using namespace std;

int main(){
     
	int a,b,c;
	scanf("%d",&c);
	for(b = c; b >=1;b-- ){
     
		for(a = 1;a <= b;a++){
     
			if(a * a + b * b == c*c) {
     
				printf("%d %d\n",a,b);
				return 0;
			}else if(a * a + b * b > c * c){
     
				break;
			}else continue;
		}
	}
	return 0;
}

C

题目描述
我们知道计算机的大小单位有 B, KB, MB 等,现在请你编写一个计算器进行大小单位换算。
提示,1 GB = 210MB=220KB = 230B。

输入格式
输入一个字符串,由一个 0 到 1023 之间的整数,一个单位名称(大写字母),一个等于号和问号,以及第二个单位名称。

单位只有可能是 GB,MB,KB,B 之间的一个。

输出格式
输出一个数字,精确到小数点后 6 位。

输入输出样例
输入 #1复制
128MB=?GB
输出 #1复制
0.125000
输入 #2复制
64MB=?KB
输出 #2复制
65536.000000
题目链接

#include 

using namespace std;

int main(){
     
	string s;
	cin >> s;
	char R,C;
	double a = 0;
	bool falg1 = true,falg2 = false;
	for(int i = 0;i < s.length();i++){
     
		if(falg1){
     
			if(s[i] == 'B') {
     
				falg1 = false;
				falg2 = true;
			}
			if(s[i] <='9' && s[i] >= '0'){
     
				a *= 10;
				a += s[i] - '0';
			}
		}
		if(falg2){
     
			if(s[i-1] <='9' && s[i-1] >= '0') R = 'B';
			else R = s[i-1];
			falg2 = false;
		}
		if(s[i] == '?'){
     
			C= s[i+1];
			break;	
		}
	}
	if(R == 'G'){
     
		if(C == 'G'){
     
			printf("%.6lf\n",a);
		}else if(C == 'M'){
     
			printf("%.6lf\n",a*(pow(2,10)));
		}else if(C == 'K'){
     
			printf("%.6lf\n",a*(pow(2,20)));
		}else if(C == 'B'){
     
			printf("%.6lf\n",a*(pow(2,30)));
		}
	}else if(R == 'M'){
     
		if(C == 'G'){
     
			printf("%.6lf\n",a*(pow(2,-10)));
		}else if(C == 'M'){
     
			printf("%.6lf\n",a);
		}else if(C == 'K'){
     
			printf("%.6lf\n",a*(pow(2,10)));
		}else if(C == 'B'){
     
			printf("%.6lf\n",a*(pow(2,20)));
		}
		
	}else if(R == 'K'){
     
		if(C == 'G'){
     
			printf("%.6lf\n",a*(pow(2,-20)));
		}else if(C == 'M'){
     
			printf("%.6lf\n",a*(pow(2,-10)));
		}else if(C == 'K'){
     
			printf("%.6lf\n",a);
		}else if(C == 'B'){
     
			printf("%.6lf\n",a*(pow(2,10)));
		}
		
	}else if(R == 'B'){
     
		if(C == 'G'){
     
			printf("%.6lf\n",a*(pow(2,-30)));
		}else if(C == 'M'){
     
			printf("%.6lf\n",a*(pow(2,-20)));
		}else if(C == 'K'){
     
			printf("%.6lf\n",a*(pow(2,-10)));
		}else if(C == 'B'){
     
			printf("%.6lf\n",a);
		}
	}
	return 0;
}

D

题目描述
小 A 参加一个综艺节目。一共有 n(3<= n <106)名评委参与打分(分数范围是 0 到 100 的整数),每个评委依次亮出自己的得分。

为了节目效果,要求从第三个评委开始,每当第 i 个评委给出打分后,立刻计算出出这个选手在前 i 名评委的打分中,去掉一个最高分和一个最低分,剩下 i-1 个评委的平均分,保留 2 位小数。

输入格式
第一行输入一个整数 n,表示评委人数。

第二行输出 n 个整数,表示各个评委的打分。

输出格式
输出共 n-2 行,每行表示对应的答案。

输入输出样例
输入
6
11 45 14 19 19 81
输出
14.00
16.50
17.33
24.25
题目链接

#include 

using namespace std;

int main(){
     
	int n;
	scanf("%d",&n);
	double count = 0.0;
	double ave,sum = 0;
	int max = -1,min = 101;
	for(int i = 0;i < n;i++){
     
		int k;
		bool flag1 = false,flag2 = false;
		int premax,premin;
		scanf("%d",&k);
		if(k < min) {
     
			premin = min;
			min = k;
			flag1 = true;
		}
		if(k > max) {
     
			premax = max;
			max = k;
			flag2 = true;
		}
		if(i == 0 || i == 1) {
     
			sum +=k;
			continue;
		}
		count++;
		if(i == 2) {
     
			sum += k;
			sum -= (max + min);
			ave = sum;
			printf("%.2lf\n",ave);
			continue;
		}
		
		if(flag1) sum += premin;
		else if(flag2) sum += premax;
		else sum += k;
		ave = sum/count;
		printf("%.2lf\n",ave);
	}
	return 0;
}

E

题目描述
在 1582 年之前,以 4 为倍数的年份为闰年。正常情况下,一年中一月到十二月的天数分别是 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 天。如果这年是闰年,那么二月则有 29 天。

但某位皇帝发现这么做其实不够准确,会造成误差,因此规定从 1582 年开始,以 4 为倍数的年份,除了以 100 为倍数且不为 400 的倍数年份,才是闰年。同时为了消除误差,规定 1582 年 10 月 4 日的下一天是 1582 年 10 月 15 日,中间的日期就当作不存在了。
现在给出日期,计算这个日期到公元 1 年 1 月 1 日经过的天数。

输入格式
按照 日月年 的格式输入数据,其中日是 1 到 31 之间的整数,月是三个大写字母,年是 1 到 9999 之间的整数。保证这个日期是合法且存在的。

月份的大写字母:

1月:JAN
2月:FEB
3月:MAR
4月:APR
5月:MAY
6月:JUN
7月:JUL
8月:AUG
9月:SEP
10月:OCT
11月:NOV
12月:DEC
输出格式
输出一个整数表示答案

输入输出样例
输入
1JAN1
输出
0
输入
4OCT1582
输出
577736
输入
15OCT1582
输出
577737
输入
21NOV2020
输出
737751
题目链接

你可能感兴趣的:(#,传智杯,数据结构)