目录
思路
代码
题目链接:
P8680 [蓝桥杯 2019 省 B] 特别数的和
思路
最开始我思路主要是从数字转字符串上想的。因为我们需要判断每一位是否是特殊数,字符串很容易做到这一点,只是在数字相加这一步不好实现。
需要用到字符串与数字的转化知识。
写这篇文章也主要是想记住这个知识(而不是注重这道题了)
头文件#include<string>
数字转字符串:string a=to_string(x)
字符串转数字:int b=stoi(x)
只是devc++里不能直接用这个函数
如何在Dev-Cpp中使用C++11中的函数:stoi、to_string、unordered_map、unordered_set、auto
这个博主讲了办法,可以解决这个问题
也不麻烦,可以调一下。
我的思路是for循环从1开始遍历到n,循环内部:
①将每次的数字转化成字符串,计算字符串长度。这里一定注意先转字符串,之后直接利用string类型内置size()函数计算字符串长度也就是数字位数。如果想先算位数,不能用sizeof(x)直接计算,因为在转字符串之前,数字是int类型的,sizeof计算出来是int类型的大小。
计算位数是想使用switch函数,处理不同位数的情况。
②使用switch函数,针对每一种情况,判断每一位是否是我们的特殊数字。这里注意switch每一种情况后都要加break
这里就不放我的代码了,这种写法写的太麻烦了😂
另一种思路(也是更常用的思路把)就是:不需要转换,刚刚说字符串的优势是判断每一位很方便。
那么我们想知道一个数字的位数其实实现也不难。(应该是我练得少,忘了这个emm)
在 x每次都对10取商,当其值不为0时,我们就将这个数每次 对10取余,就可以判断这个数是不是我们想要的。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n,sum;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int tmp=i;//记得给i找替身
while(tmp)
{
if(tmp%10==2 || tmp%10==0 || tmp%10==1 || tmp%10==9)
{
sum+=i;
break;
}
tmp/=10;//数位分解
}
}
cout<<sum;
return 0;
}
好噜,就写到这里。最近写文章估计都是这种一道题里我想记住的知识点,或者没做出来的题这种。
有问题欢迎指出,一起加油!!