20240328每日一题题解
摘要
本文对于2024年3月28日的每日一题进行了问题重述,并将问题拆解为五个步骤,分别进行了详细的讨论与求解,实现了整型与字符串类型的互相转换。并且还指出,在编写C++
程序时,需要观察数据范围,在有必要时使用长整型(long long
)存储数据,以免出现整型溢出现象。
关键词:长整型;字符串;相互转换;整型溢出;
目录
-
问题重述
-
问题分析
-
模型的建立与求解
Step1~Step5
-
模型的分析与检验
- 模型的分析
- 模型的检验
-
模型的评价与推广
- 模型的评价
- 模型的推广
问题重述
判断给出的整数x,是否出现过数字 \(62\) 或者能够被 \(62\) 整除。
如果是,输出 Yes
,否则输出 No
。
保证 \(1 \leq x \leq 10 ^ {18}\)。
问题分析
可以将问题拆解为以下个部分:
- 选择合适的类型读入整数
x
; - 判断
x
能否被 \(62\) 整除; - 判断
x
中是否出现过数字 \(62\) ; - 按照步骤 3 和步骤 4 ,得到答案
- 输出答案
\(Step1\)
注意到题目中提到 \(1 \leq x \leq 10 ^ {18}\)。我们应选择long long
(长整型)这种数据类型存放x
,确保变量不会出现溢出。
\(Step2\)
为了判断整型x
能否被 \(62\) 整除,可以使用取余(取模)运算。运算符为%
(\(\bmod\))。
\(Step3\)
本题的一大难点在于如何将身为long long
类型的变量x
转化为字符串类型,而后判断其中是否存在子串"62"
。为此,我们既可以手动实现(利用除法和取模运算,依次提取出x
的每一位并存放到字符串当中,再进行判断),也可以使用C++11
中提供给我们的to_string()
函数。在这里,手动提取算法不过多赘述,我们使用更加简洁方面的to_string()
函数。
to_string()
函数的参数接受一个整型,并返回一个string
类型字符串。
比如,如果执行:
int x;
cin>>x;
string str;
str=to_string(x);
就会把输入的整型x
存放到字符串str
当中。
接下来我们使用string.find()
函数来查找字符串中是否存在"62"
。string.find()
函数的功能是在字符串中查找是否存在指定的字符串,如果存在,则返回找到的地方(下标);如果不存在则返回一个常量string::npos
。这个常量通常是-1
,但是在不同编译器下有所不同。故,欲判断字符串中是否存在某个字串,只需判断函数string.find("子串")
是否等于string::npos
这个值即可。
比如,如果执行:
string str;
cin>>str;
if(str.find("abc")==string::npos)
{
cout<<"存在abc"<<endl;
}
可以判断用户输入的字符串是否存在子串"abc"
。
\(Step4\)
综合\(Step3\)和\(Step4\),我们将得到两个表达式,分别能够判断整型变量中是否出现过数字 \(62\) ,是否能够被 \(62\) 整除。
注意到题目中使用的逻辑词为或,这代表两个逻辑表达式的关系应该是or
的关系。
\(Step5\)
经过\(Step3\sim Step5\)的计算,如果最后的两者之或为True
,则输出Yes
;否则输出No
。
模型的建立与求解
#include<iostream>
using namespace std;
int main()
{
long long x;
cin>>x;
if(x%62==0 || to_string(x).find("62")!=string::npos)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}
模型的分析与检验
模型的分析
手动测试了几组样例,均符合理想情况,说明我们编写的代码在大部分情况下是正确的。
模型的检验
我们将代码提交至在线评测平台,发现可以通过所有样例点(见下图1)。可以证明我们的代码具有极高的正确性。
模型的评价与推广
模型的评价
优点:
- 很好的解决了跨数据类型的问题,实现了整型到字符串类型的转换。
- 代码简明,操作简单,效率高。
- 可以用于解决其他的数学问题,可修改模型中的变量与判断条件,具有可推广性。
缺点:
- 仅支持将整型转化为字符串,不了解是否支持将浮点型或者负数转化为字符串。
- 仅支持单向转化,未解决如何将字符串转化为整型等数字类型。
- 如果数据范围更大,例如\(\ge10^{18}\),无法推广至更大的数字。
模型的推广
- 使用手动编写的
to_string()
函数,支持更多数据类型到字符串的转换。 - 编写更多函数,使字符串也可以转化成整型等数字类型。
- 手写高精度,实现在更大的数据范围下,模型依然能够很好的工作。