P8680 [蓝桥杯 2019 省 B] 特别数的和:做题笔记

目录

思路 

代码


题目链接:

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;
}

好噜,就写到这里。最近写文章估计都是这种一道题里我想记住的知识点,或者没做出来的题这种。

有问题欢迎指出,一起加油!!

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值