题目来源:T296805 幸运数字 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
我们称有以下特征的数为幸运数:
1.所有的数位和是6的倍数
2.数位中至少包含1个6
请你计算1~n的正整数中有多少个幸运数?并输出这个范围内最大的幸运数。
输入格式
输入一个正整数n
输出格式
输出两个整数
第一个数表示[1,n]内幸运数的个数,第二个数是表示其中最大的幸运数,如果这个范围不存在幸运数,则输出N0
输入输出样例
输入 #1复制
62输出 #1复制
2 60输入 #2复制
5输出 #2复制
N0说明/提示
(1 ≤ n ≤ 1e8)
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
int cnt=0;
vector<int> a;
int main(){
int n;
cin>>n;
//超时优化:数位和是6的倍数必然是3的倍数,而数位和是
//3的倍数的数必然是3的倍数,所以只需遍历6开始的3的倍数
for(int i=6;i<=n;i+=3){
//每次循环要重新初始化
bool lucknum=false;
int dight=0,dightsum=0,num=i;
while(num){
dight=num%10;
if(dight==6){
lucknum=true;
}
dightsum+=dight;
num/=10;
}
if(lucknum==true&&dightsum%6==0){
cnt++;
a.push_back(i);
}
}
if(cnt==0)
//题目不是NO,是N0!
cout<<"N0";
else
cout<<cnt<<' '<<a[a.size()-1]<<endl;
// for(int e:a)
// cout<<e<<" ";
return 0;
}
复杂版:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
pair<int,bool> dight_sum_has6(int n){
pair<int,bool> sum_has6={0,false};
int dight=0;
while(n){
dight=n%10;
if((sum_has6.second!=true)&&dight==6)
sum_has6.second=true;
sum_has6.first+=dight;
n/=10;
}
return sum_has6;
}
pair<int,int> count_luck_num(int n){
pair<int,int> res={0,0};//first:个数;second:最大幸运数
for(int i=6;i<=n;i+=3){//优化范围到3的倍数
if(dight_sum_has6(i).second==true&&dight_sum_has6(i).first%6==0){
res.first++;//计数
res.second=max(res.second,i);
}
}
return res;
}
int main(){
int n;
cin>>n;
auto luckcount_max=count_luck_num(n);
if(luckcount_max.first==0){
cout<<"N0";
}
else{
cout<<luckcount_max.first<<" "<<luckcount_max.second;
}
return 0;
}