第三届传智杯全国IT技能大赛 练习赛题解

2 篇文章 0 订阅

纪念第一次AK~~
不过也只能在这种级别的简单题做完了(菜是原罪)

1各数字之和

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

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

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

输入输出样例
输入 #1复制
50
输出 #1复制
5
说明/提示
11 到 5050 的所有整数中,有 9,18,27,36,459,18,27,36,45 这 55 个数字符合要求。
暴力出奇迹

#include<iostream>
using namespace std;
int weishu(int x)
{
	int sum=0,temp;
	
	while(x)
	{	//记得加剪枝 不然可能会超时
		if(sum>9) return 0;
		temp=x%10;
		sum+=temp;
		x/=10;
		
	}
	if(sum==9)
	 return 1;
	 else return 0;
 }
  
int main()
{	int n;
	cin>>n; 
	int ans=0;
	for(int i=9;i<=n;i++)
	{
		ans+=weishu(i);
	}
	cout<<ans<<endl;
	return 0;
 }


2直角三角形

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

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

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

输入输出样例
输入 #1复制
50
输出 #1复制
5
说明/提示
11 到 5050 的所有整数中,有 9,18,27,36,459,18,27,36,45 这 55 个数字符合要求。
暴力出奇迹 数字乘积可能会过大 开int 会WA,开long long 保险

#include<iostream>
#include<cmath>
using namespace std;
int main()
{	
long long  a,b,c,n;
	cin>>c;

	for(a=1;a<c;a++)
	{
		for(b=a;b<c;b++)
		{
			if(a*a + b*b == c*c )
			{
				cout<<a<<" "<<b<<endl;
				return 0;
			}
		}
	}



	return 0;
 }


3单位转换

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

提示,11 GB = 2^{10}2
10
MB = 2^{20}2
20
KB = 2^{30}2
30
B。

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

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

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

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

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
	string s;
	double input,ouput; //可以看做是输入了一串数字+一串字符串来处理
	cin>>input>>s;  
	int len=s.size();
	
	//记录差值 输入的级别 输出的级别 
	int delta,input_l,ouput_l;

	if(s[0]=='G') input_l=4;
	else if(s[0]=='M') input_l=3;
	else if(s[0]=='K') input_l=2;
	else input_l=1;
	
	if(s[len-2]=='G') ouput_l=4;
	else if(s[len-2]=='M') ouput_l=3;
	else if (s[len-2]=='K') ouput_l=2;
	else ouput_l=1;
//	cout<<input_l<<" "<<ouput_l<<endl;
	//找到输入和输出之间的等级差 就好办了
	delta=input_l-ouput_l;
	ouput= input* pow(1024,delta); //1024的delta次方
	printf("%.6lf",ouput);
	return 0;
}


4评委打分

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

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

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

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

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

输入输出样例
输入 #1复制
6
11 45 14 19 19 81
输出 #1复制
14.00
16.50
17.33
24.25

随着输入记录最大值最小值就行

#include<iostream>
#include<algorithm>
using namespace std;
int num[1000005];
int main()
{
	long long sum=0;
	int n,maxv=-1,minv=105;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&num[i]);
		sum+=num[i];
		maxv=max(maxv,num[i]);
		minv=min(minv,num[i]);
		
		if(i>=2)
		{
			double avg=(sum-minv-maxv)/((i-1)*1.0);
			printf("%.2lf\n",avg);
		}
	
	}
	
	
	
//	printf("%d",n);
	return 0;
 }


5 儒略历

题目描述
在 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
输出格式
输出一个整数表示答案

输入输出样例
输入 #1复制
1JAN1
输出 #1复制
0
输入 #2复制
4OCT1582
输出 #2复制
577736
输入 #3复制
15OCT1582
输出 #3复制
577737
输入 #4复制
21NOV2020
输出 #4复制
737751

这道题注意细节就好

#include<iostream>
using namespace std;
int change_year(string y) //字符串转数字函数
{	int ans=0;
	int len=y.size();
	for(int i=0;i<len;i++)
	{
		ans=ans*10 + int(y[i]-'0');
	}
	return ans;
}
bool reap(int y) //判断是否为闰年
{
	return ((y%4== 0 && y%100!=0 )|| y%400==0);
}
int main()
{	string mouth="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
	long long  ans=0;
	int d;
	string s;
	cin>>d>>s;
	int len=s.size();
	string y=s.substr(3,len-3);
	string m=s.substr(0,3);
//	cout<<m.size()<<m<<endl;
	int day,mou,year; //日月年 
	day=d;
	
	//上面为字符串输入处理: 
	mou=mouth.find(m)/3+1;
	year=change_year(y);
//	cout<<year <<mou<<day<<endl; 
	for(int i=1;i<=year;i++)
	{	
		if(i<1582)
		{
			for(int j=1;j<=12;j++)
			{
				int days;
				if(j==1 || j== 3 || j == 5 || j==7 || j== 8 || j== 10 || j==12)
				{
					days=31;
				}
				else if( j== 4 || j==6 || j== 9 || j== 11)
				days=30;
				else if(j==2 && i%4 == 0) 
				{
					days =29;
				//	cout<<"闰年"<<endl;
				}
				else if(j==2 && i%4 != 0) {
					days=28;
					//cout<<"不是闰年"<<endl;
				}
				
				for(int k=1;k<=days;k++)
				{
					
					if(i == year&& j == mou && k==day)
					{
						cout<<ans<<endl;
						return 0;
					}
					ans++;
			
			
				}
				
				
			}
		}
		else
		{
			for(int j=1;j<=12;j++)
		{	int days;
			if(j==1 || j== 3 || j == 5 || j==7 || j== 8 || j== 10 || j==12)
			{
				days=31;
			}
			else if( j== 4 || j==6 || j== 9 || j== 11)
			days=30;
			else if(j==2 && reap(i)) days =29;
			else if(j==2 && !reap(i)) days=28;
			for(int k=1;k<=days ; k++)
			{
		
				if(i == year&& j == mou && k==day)
				{
					cout<<ans<<endl;
					return 0;
				}
						ans++;
				if(i == 1582 && j== 10 && k==4) k+=10;
			}
			
			
		}
		}
	}
	
	
	
	
	return 0;
 }


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值