P8680 蓝桥杯备赛第五天
题目分析:对于这个题较好的方法就是找到一种能处理特殊数字的判别方法,然后进行求和即可,我想了好久都没想出来,所以这次就是看着大佬的思路我自己上手测试。
源代码:#include<bits/stdc++.h>
using namespace std;
bool m(int n)
{
while(n)
{
int t=n%10;
if(t==0||t==1||t==2||t==9)
return true;
n=n/10;
}
return false;
}
int main()
{
int n,i,sum=0;
cin>>n;
for(i=1;i<=n;i++)
if(m(i))
sum+=i;
cout<<sum;
return 0;
}
收获:这个题目中对数据的限制没有超过整数的(应用数列求和公式判断最大值),所以没有开long long,通过借助if和while语句的判断,还有bool型函数特殊的输出形式,本题可解。
大佬对于数据的处理也是细思极恐,那个变量t的设置,实现了防止因n提前结束,同时对于要判断的数是i,不是n,总有小笨狗不细心,没错就是我。强烈建议看完之后自己上手来一遍!看会不代表学会。
优化思路:可以试着将四个数存入数组判断int num[10]={2, 0, 1, 9};还可以加入ios::sync_with_stdio(false);(关闭了同步流,加快数据的读取,即写上以上代码后表示不能使用scanf和printf了,不能再用cout<<endl。而应该改用cout<<'\n'。endl在关闭后没有自动刷新缓冲区的功能了)对于要求时间限制的题型有很大帮助。
方法二:
for(i=1;i<=n;i++)
{
k=i;
while(k)
{
s=k%10;
if(s==0||s==1||s==2||s==9)
{
sum+=i;
break;
}
k=k/10;
}
}
解析:首先采用for循环控制语句,接着采用while进行判断,进而通过if语句实现求和操作!时间复杂度两者相同