题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。2022 年 2 月 22 日 22:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组 成, 如果将时间中的时和分写成 4 位, 还是由 3 个 2 和 1 个 0 组成。
小蓝对这样的时间很感兴趣, 他还找到了其它类似的例子, 比如 111 年 10 月 11 日 01:11,2202 年 2 月 22 日 22:02 等等。
请问, 总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成 4 位后由 3 个一种数字和 1 个另一种数字组成。注意 1111 年 11 月 11 日 11:11 不算,因为它里面没有两种数字。
实现代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
// 首先存有效时间,然后再循环,对应各自的时间范围判断是否正确
int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char legalnum[4][4]={0};
int yy,mm,dd,hh,min=0;
int count=0;
for(int one=0;one<10;one++) // 出现了一次的数字
{
for(int three=0;three<10;three++) // 出现了三次的数字
{
// 这里是循环数字,找出2202类似的数字
if(one==three)
{
continue;
}
else // 这里是把合法数字存到二维数组里
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
legalnum[i][j]='0'+three; // 出现三次的数字
}
legalnum[i][i]='0'+one; // 对角线是只出现一次的数字
}
}
// 把合法数字分成 yy,mm,dd,hh,min
for(int i=0;i<4;i++)
{
sscanf(legalnum[i],"%4d",&yy); // 把年存到yy
for(int j=0;j<4;j++)
{
sscanf(legalnum[j],"%2d %2d",&mm,&dd); // 把月存到mm,日存到dd
if(mm>12||mm<1)
{
continue;
}
if(dd<1||dd>month[mm])
{
continue;
}
for(int k=0;k<4;k++)
{
sscanf(legalnum[k],"%2d %2d",&hh,&min); // 把小时存到hh,分钟存到min
if(hh>23)
{
continue;
}
if(min>59)
{
continue;
}
//cout<<yy<<"-"<<mm<<"-"<<dd<<"-"<<hh<<"-"<<min<<endl;
count++;
}
}
}
}
}
cout<<count;
}
解题思路
先把特殊数字存进数组里,然后取出来这些数,根据不同的要求对其进行筛选,最后得出正确答案。
注意点
- 注意输入和输出的方式。
知识点
sscanf(legalnum[j],"%2d %2d",&mm,&dd);
函数使用,一般有空格的输入就用这个,然后要取前几位的也可以用这个。