题目描述
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 n 中,所有这样的数的和是多少?
输入格式
输入一行包含一个整数 n。
输出格式
输出一行,包含一个整数,表示满足条件的数的和。
输入输出样例
输入 #1
40
输出 #1
574
说明/提示
对于 20% 的评测用例,1≤n≤10。
对于 50% 的评测用例,1≤n≤100。
对于 80% 的评测用例,1≤n≤1000。
对于所有评测用例,1≤n≤10000。
蓝桥杯 2019 省赛 B 组 F 题。
---------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------
#include <iostream>
#include <string>
using namespace std;
int main()
{int n, i, sum;cin >> n;string a = "2", b = "0", c = "1", d = "9";for (i = 1,sum = 0; i <= n; i++){string I = to_string(i);string::size_type idx;idx = I.find(a);if (idx == string::npos); //不存在,无操作else{sum = sum + i; //符合条件,求和continue;}idx = I.find(b);if (idx == string::npos); //不存在,无操作else{sum = sum + i; //符合条件,求和continue;}idx = I.find(c);if (idx == string::npos); //不存在,无操作else{sum = sum + i; //符合条件,求和continue;}idx = I.find(d);if (idx == string::npos); //不存在,无操作else{sum = sum + i; //符合条件,求和}}cout << sum;return 0;
}
此题易疏忽的点是忘记用continue语句,导致如“21”这样同时含有2和1的数多次重复求和!
———————————————————————————————————————————
———————————————————————————————————————————
本解法使用了“字符串中查找另一个字符串的函数find”,这样可以判断“字符串里面是否含有某个字符串”。功能为在string对象中,查找参数string类型的字符串是否存在,如果存在,返回起始位置。不存在则返回 string::npos。
其重载形式为:
string::size_type string::find(string &);
注:头文件要包含#include<string>
———————————————————————————————————————————
参考代码如下:
string a = "xyz123";string b = "y";string c = "2";string::size_type idx;idx = a.find(b); //在a中查找b.if (idx == string::npos ) //不存在cout << "0";else //存在。cout << "1"; idx = a.find(c); //在a中查找c。if (idx == string::npos) //不存在cout << "0";else //存在。cout << "1";
如此,使用find函数是不是方便我们许多呢~
祝看到这里的伙伴学C有成!