第一题:门牌制作
题目描述
小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。请问要制作所有的1到2020号门牌,总共需要多少个字符2?
题目分析
暴力搜索,判断每个位置的字符是否满足条件
题目代码
#include <iostream>
using namespace std;
int main(){
int ans=0;
for(int i=1;i<=2020;i++)
{
int num=i;
while(num){
if(num%10==2) ans=ans+1;
num/=10;
}
}
cout<<ans<<endl;
return 0;
}
题目答案
624
第二题:既约分数
题目描述
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如,3/4,5/2,1/8,7/1都是既约分数。请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1和2020)
题目分析
暴力搜索,通过最大公约数判断
题目代码
#include <iostream>
using namespace std;
int gcd(int a,int b)//最大公约数
{
if(a%b==0) return b;
else return gcd(b,a%b);
}
int main(){
int i,j,ans=0;
for(i=1;i<=2020;i++)//分子
{
for(j=1;j<=2020;j++)//分母
{
if(gcd(i,j)==1)
{
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
第三题:蛇形填数
题目描述
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少?
1 1 2 6 7 15 …
2 3 5 8 14 …
3 4 9 13 …
4 10 12 …
5 11 …
题目分析
可以将图形顺时针旋转45度,我们可以发现第一行是1,加4变成第二行第二个数,第二行第二个数加8就是第三行第三个数,依次类推....就可以算出来了(我这是纯纯的找规律,网上还有其他解法,主要这是填空题,怎么快怎么来)
1行1列 1
3 2 +4
2行2列 4 5 6
10 9 8 7 +8
3行3列 11 12 13 14 15
................. +12
题目代码
#include <iostream>
using namespace std;
int main(){
int i,number=1;
for(i=1;i<20;i++)
{
number=number+4*i;
}
cout<<number<<endl;
return 0;
}
题目答案
761
第四题:跑步锻炼
题目描述
小蓝每天都锻炼身体。正常情况下,小蓝每天跑1千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑2千米。如果同时是周一或月初,小蓝也是跑2千米。小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。请问这段时间小蓝总共跑步多少千米?
题目分析
首先算出总的天数,和月份数,然后求出一共有多少个周一,和周一里面为月初的天数
最后总天数+周一天数+月初天数 - 周一和月初重合天数
题目代码
//跑步锻炼
#include <iostream>
using namespace std;
int run_nian(int year){
return (year%400==0)||(year%4==0&&year%100!=0);
}
int main(){
int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int day=0;
//计算2000年1月1日到2020年9月低
for(int i=2000;i<=2020;i++)
{
if(run_nian(i))month[2]=29;
else month[2]=28;
for(int j=1;j<=12;j++) {
if(i==2020&&j==10)break;
day+=month[j];
}
}
int month_first=21*12-2;//计算从头到尾的月初的个数
int week=6;
int monday=0;//记录星期一的个数
int week1=0;
int m_m=0;//既是星期一又是月初
//计算 从头到尾的星期一个数和既是星期一又是月初的个数
for(int m=2000;m<=2020;m++){
if(run_nian(m)){
month[2]=29;
for(int n=1;n<=12;n++){
if(m==2020&&n==10)break;
for(int t=1;t<=month[n];t++){
week1=week%7;
if(week1==1){
monday++;
if(t==1)m_m++;}
week++;
}
}
}
else{
month[2]=28;
for(int n=1;n<=12;n++){
if(m==2020&&n==10)break;
for(int t=1;t<=month[n];t++){
week1=week%7;
if(week1==1){
monday++;
if(t==1)m_m++;}
week++;}
}
}
}
int ans=0;
ans=day+1+month_first+monday-m_m;
cout<<ans<<endl;
return 0;
}
题目答案
8879
第六题成绩统计
题目描述
小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
【输入格式】 输入的第一行包含一个整数n,表示考试人数。接下来n行,每行包含一个0至100的整数,表示一个学生的得分。
【输出格式】 输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。
【样例输入】
7
80
92
56
74
88
100
0
【样例输出】
71%
43%
题目代码
#include <iostream>
#include <stdio.h>
using namespace std;
int a[10000]={0};
int main(){
int m,jige=0,youxiu=0;
cin>>m;
for(int i=0;i<m;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
if(a[i]>=60) jige++;
}
for(int i=0;i<m;i++){
if(a[i]>=85) youxiu++;
}
cout<<jige*100/m<<"%"<<endl;
cout<<youxiu*100/m<<"%"<<endl;
}
第七题:回文日期
题目描述
2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按“yyyymmdd”的格式写成一个8位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示20200202是“千年一遇”的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202即2021年12月2日。也有人表示20200202并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100年后就能遇到下一个ABABBABA型的回文日期:21211212即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。
【输入格式】
输入包含一个八位整数N,表示日期。
【输出格式】
输出两行,每行1个八位数。第一行表示下一个回文日期,第二行表示下一个ABABBABA型的回文日期。
【样例输入】
20200202
【样例输出】
20211202
21211212
【评测用例规模与约定】
对于所有评测用例,10000101 <= N <= 89991231,保证N是一个合法日期的8位数表示。
题目分析
- 直接枚举年份
a
,将其翻转得到b
,那么a + b
就是一个回文数; - 用
substr
分离出月份和天数,再判断月份和天数是否合法;
题目代码
#include <iostream>
#include <algorithm>
using namespace std;
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(int year)
{
return year % 400 == 0 || year % 4 == 0 && year % 100 != 0;
}
int get_day(int year, int month)
{
if(month == 2) return 28 + check(year);
return days[month];
}
int main()
{
int n;
cin >> n;
string ans1, ans2;
bool flag1 = false, flag2 = false;
for (int i = n / 10000; i <= 9999; i ++)
{
string a = to_string(i);
string b = a;
reverse(b.begin(), b.end());
if(a + b <= to_string(n)) continue;
int month = stoi(b.substr(0, 2));
int day = stoi(b.substr(2, 2));
if(month < 1 || month > 12) continue;
if(day < 1 || day > get_day(i, month)) continue;
string s1 = a.substr(0, 2);
string s2 = a.substr(2, 2);
if(!flag1) ans1 = a + b, flag1 = true;
if(!flag2 && s1 == s2 && s1[0] != s1[1]) ans2 = a + b, flag2 = true;
if(flag1 && flag2) break;
}
cout << ans1 << endl;
cout << ans2 << endl;
return 0;
}