洛谷-P10424 [蓝桥杯 2024 省 B] 好数
题目要求统计 1 到 N 之间的好数。数位从低到高、从第 1 位开始编号:奇数位上的数字为奇数,偶数位上的数字为偶数,才算好数。
可以从 1 枚举到 n,逐个检查数位。C++ 写法将数字转成字符串后反转,从个位开始检查;Python 写法则反复对 10 取模,检查完个位后整除 10,继续处理下一位。
C++ 代码如下:
#include<iostream>
using namespace std;
#include<string>
#include<algorithm>
int main()
{
int n=0;
cin>>n;
int count=0;
for(int i=1;i<=n;i++)
{
// 将数字转成字符串,然后反转.
string s=to_string(i);
reverse(s.begin(),s.end());
bool flag=1;
//反转后的字符串,最高位就是原本的奇数位了,然后往后遍历.
for(int j=0;j<s.size();j++)
{
//如果j能被2整除,比如0,那其实是奇数位.
if(j%2==0)
{
//奇数位如果被2整除就不符合条件.
if((s[j]-'0')%2==0)
{
flag=0;
break;
}
}else{
//偶数位不能被2整除就不符合条件.
if((s[j]-'0')%2!=0)
{
flag=0;
break;
}
}
}
//如果所有数位都符合条件,flag依然是1,然后统计次数加一次.
if(flag)count++;
}
//最后打印一下
cout<<count<<endl;
}Python 代码如下:
def check(x):
# cnt标志是奇数位还是偶数位,
cnt=1
# x不为0就一直对10取模求最后一位,然后整除10去掉最后1位
while x!=0:
t=x%10
x//=10
if cnt&1:
# 如果cnt是奇数,t是偶数就不符合条件,直接返回False
if t%2==0:
return False
else:
# 如果cnt是偶数,t是奇数就不符合条件,直接返回False
if t%2==1:
return False
cnt+=1
return True
n=int(input())
count=0
for i in range(1,n+1):
if check(i):
count+=1
print(count)这份 Python 写法在我当时的提交中需要使用 PyPy3 才能通过。题目数量级达到 ,每个数还要逐位检查,解释器和评测环境会影响运行时间。
谢谢你读到这里。 ✧
下一篇文章洛谷-P8716 [蓝桥杯 2020 省 AB2] 回文日期