学习数据结构的第二十天
[蓝桥杯 2019 省 B] 特别数的和
题目描述
小明对数位中含有 2 2 2、 0 0 0、 1 1 1、 9 9 9 的数字很感兴趣(不包括前导 0 0 0),在 1 1 1 到 40 40 40 中这样的数包括 1 1 1、 2 2 2、 9 9 9、 10 10 10 至 32 32 32、 39 39 39 和 40 40 40,共 28 28 28 个,他们的和是 574 574 574。
请问,在 1 1 1 到 n n n 中,所有这样的数的和是多少?
输入格式
输入一行包含一个整数 n n n。
输出格式
输出一行,包含一个整数,表示满足条件的数的和。
样例 #1
样例输入 #1
40
样例输出 #1
574
提示
对于 20 % 20\% 20% 的评测用例, 1 ≤ n ≤ 10 1 \le n \le 10 1≤n≤10。
对于 50 % 50\% 50% 的评测用例, 1 ≤ n ≤ 100 1 \le n \le 100 1≤n≤100。
对于 80 % 80\% 80% 的评测用例, 1 ≤ n ≤ 1000 1 \le n \le 1000 1≤n≤1000。
对于所有评测用例, 1 ≤ n ≤ 10000 1 \le n \le 10000 1≤n≤10000。
蓝桥杯 2019 省赛 B 组 F 题。
枚举嘛,对吧。值得注意的是前缀0不是。所以啊,就不要想着什么用栈来解了,麻烦的嘞。依我所见,这道题目还是老老实实除求位数吧。这个更简单一点。还有,只要满足有2 0 1 9就行,当然0不能在最前面。然后就是求和,建议尽早处理,不然会很难受。我这里给出两种方法,你会用那种求和思路呢?
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
ll n;
ll sum;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int m=i;//注意啊,一定要有数来承接,不然直接用i的话会出现i越除越小导致死循环。
while(t){//反正不能为0;
if(m%10==2||m%10==0||m%10==1||m%10==9){
sum+=i;///求和
break;
}
m/=10;//进一位
}
}
cout<<sum;
return 0;
}
这是第二种
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long int a,sum=0;
scanf("%lld",&a);
long long int book[a+1];
long long int h=a,m=0;
for(long long int j=1;j<=a;j++)
{
m=j;
while (j != 0) {
if (j % 10 == 2 || j % 10 == 0 || j % 10 == 1 || j % 10 == 9) {
book[m]=1;//标记法,问就是搜索干的
break;
}
j=j/10;
}
j=m;
}
for(long long int j=1;j<=h;j++)
{
if(book[j]==1)
{
sum=sum+j;
}
}
printf("%lld",sum);
return 0;
}
题目千变万化,最重要的还是自己的思路。