【问题描述】
九进制正整数(2022)下标9 转换成十进制等于多少?
方法:
权值展开
2*93 +2 * 9+2 * 9^0=1478
如果 一定要用代码来实现 C++代码如下所示
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s = "2022";
int ans = 0;
for(int i = 0; i < s.size(); i++)
ans = ans * 9 + s[i] - '0';
cout<<ans<<endl;
return 0;
}
【顺子日期】
小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期?
解题思路:
枚举 2022 年所有的日期,然后判断是否存在顺子即可。
本题的顺子为顺序的三位数,包括 012,123,234,345,456,567,678,789。由于是 2022 年的日期,顺子只可能是 012 和 123,其余顺子不可能出现,因为其余均为非法日期。
最终只需枚举月、日,然后 check 一下每个日期中是否存在上述顺子即可
枚举 2022 年所有的日期,然后判断是否存在顺子即可。
C++的代码如下所示:
#include<bits/stdc++.h>
using namespace std;
int nums[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//数字转成字符串
string To_string(int x)
{
string s;
while(x)
s += x % 10 + '0', x /= 10;
reverse(s.begin(), s.end());
return s;
}
//检查日期中是否存在012、123
bool check(int year, int month, int day)
{
string s = To_string(year);
if(month < 10)s += "0";
s += To_string(month);
if(day < 10)s += "0";
s += To_string(day);
return (s.find("123") != s.npos) || (s.find("012") != s.npos);
}
int main()
{
int ans = 0;
//枚举月、日
for(int month = 1; month <= 12; month++)
{
for(int day = 1; day <= nums[month]; day++)
{
if(check(2022, month, day))
ans++;
}
}
cout<<ans<<endl;
return 0;
}
最终得到结果为14