P8680 [蓝桥杯 2019 省 B] 特别数的和

题目描述

小明对数位中含有 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 题。



cpp 复制代码
#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>**

---------------------------------------------------------------------------------------------------------------------------------

参考代码如下:

cpp 复制代码
     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有成!

相关推荐
yufuu988 分钟前
并行算法在STL中的应用
开发语言·c++·算法
zh_xuan8 分钟前
单青蛙跳台阶
数据结构·算法
Kx_Triumphs14 分钟前
计算几何-旋转卡壳两种实现方案(兼P1452题解
算法·题解
代码游侠17 分钟前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
charlie11451419121 分钟前
嵌入式C++教程——ETL(Embedded Template Library)
开发语言·c++·笔记·学习·嵌入式·etl
陳103021 分钟前
C++:AVL树的模拟实现
开发语言·c++
CSDN_RTKLIB33 分钟前
错进错出得到正确的字节序列
c++
闻缺陷则喜何志丹1 小时前
【前后缀分解 排序】B4274 [蓝桥杯青少年组省赛 2023] 数字游戏|普及+
c++·蓝桥杯·排序·洛谷·前后缀分解
m0_736919101 小时前
C++中的享元模式变体
开发语言·c++·算法
罗湖老棍子1 小时前
【 例 1】石子合并(信息学奥赛一本通- P1569)
数据结构·算法·区间dp·区间动态规划·分割合并