题目解析为原创可能有误 仅供参考!!!
同时为了避免篇幅太长并没有给出太详细题解(大多数只是给出了模板)!!!
试题A
请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。
请将这个数的十进制形式作为答案提交。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
其实这道题目凭感觉都能猜到答案是aaa转换为十进制为2730;
#include<iostream>
using namespace std;
bool find(int x)
{
while(x)
{
int t=x%16;
x/=16;
if(t<10)return false;//一旦某一位不是a~f就不符合
}
return true;
}
int main()
{
for(int i=2022;i<=1e9;++i)//从2022开始暴力枚举
if(find(i))
{
cout<<i<<endl;
break;
}
}
return 0;
}
输出2730
试题B
在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母,依次为 A 到 Z,接下来 26*26 列使用两个字母的组合,依次为 AA 到 ZZ。
请问第 2022 列的名称是什么?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个由大写字母组成的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。
经过计算26+26*26=702;26+26*26+26*26*26=18278;
所以答案一定是三个字符;
可以注意到每经过26*26个字符第一个字符加1;
每经过26个字符第二个字符加1;
每经过1个字符第三个字符加1;
#include<iostream>
using namespace std;
int main()
{
cout<<2022-702<<endl;//从ZZ开始往后数1320个;
cout<<1320/26/26+1<<' '<<(1320-26*26)/26+1<<' '<<1320%26<<endl;//从1开始不是0--1320%26为零是Z
//2 25 20----BYT
return 0;
}
试题C
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
请提交满足条件的日期的总数量。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include<iostream>
using namespace std;
int res;
int a[]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年 ;
int b[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年 ;
//下表映射到一所以第一个放0;
bool is_year(int x)
{//判断是否为闰年
if(x%100!=0&&x%4==0||x%400==0) return true;
return false;
}
bool cal(int x)
{
int t=x;
int cnt1=0,cnt2=0;//cnt1统计年份数字和
while(t)//cnt2统计月份日数字和
{
if(t%10) cnt1+=t%10;
t/=10;
}
for(int i=1;i<=12;++i)
{
if(is_year(x))//是闰年走if否则走else
{
int t=0;
t=i*100;
for(int j=1;j<=a[i];++j)
{
t+=j;
int tmp=t;
while(tmp)
{
if(tmp%10) cnt2+=tmp%10;
tmp/=10;
}
if(cnt1==cnt2) res++;//满足条件
t-=j;
cnt2=0//恢复原样
}
}
else
{
int t=0;
t=i*100;
for(int j=1;j<=b[i];++j)
{
t+=j;
int tmp=t;
while(tmp)
{
if(tmp%10) cnt2+=tmp%10;
tmp/=10;
}
if(cnt1==cnt2) res++;
t-=j;
cnt2=0;
}
}
}
}
int main()
{
for(int i=1900;i<=9999;++i)
{
cal(i);
}
cout<<res<<endl;
return 0;
}
输出70910
试题D
小蓝有 30 个数,分别为:99, 22, 51, 63, 72, 61, 20, 88, 40, 21, 63, 30, 11, 18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77 。
小蓝可以在这些数中取出两个序号不同的数,共有 30*29/2=435 种取法。请问这 435 种取法中,有多少种取法取出的两个数的乘积大于等于 2022 。 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include<iostream>
using namespace std;
int a[30];
int res;
//99 22 51 63 72 61 20 88 40 21 63 30 11 18 99 12 93 16 7 53 64 9 28 84 34 96 52 82 51 77
//可以直接复制没有多余空格
int main()
{
for(int i=0;i<30;++i) cin>>a[i];
for(int i=0;i<29;++i)
{
for(int j=i+1;j<30;++j)
{
if(a[i]*a[j]>=2022) res++;
}
}
cout<<res<<endl;
return 0;
}
输出189
试题E
小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 1 。
110010000011111110101001001001101010111011011011101001111110
010000000001010001101100000010010110001111100010101100011110
001011101000100011111111111010000010010101010111001000010100
101100001101011101101011011001000110111111010000000110110000
010101100100010000111000100111100110001110111101010011001011
010011011010011110111101111001001001010111110001101000100011
101001011000110100001101011000000110110110100100110111101011
101111000000101000111001100010110000100110001001000101011001
001110111010001011110000001111100001010101001110011010101110
001010101000110001011111001010111111100110000011011111101010
011111100011001110100101001011110011000101011000100111001011
011010001101011110011011111010111110010100101000110111010110
001110000111100100101110001011101010001100010111110111011011
111100001000001100010110101100111001001111100100110000001101
001110010000000111011110000011000010101000