特别的数字

特别的数字
【问题描述】

定义一种特别的数字,它的左半部分和它的右半部分完全一样,例如2020,它的左半部分和右半部分都是20,是一个特别的数字。

注意:数字202不是特别的数字,数字2112也不是特别的数字。

现在请你求出区间[1,n]的这n个数中,有多少个特别的数字。
【输入形式】

输入整数n。

【输出形式】

输出一个整数,表示区间[1,n]的这n个数中特别的数字的数量。

【样例输入】

22

【样例输出】

2

【样例说明】

[1,22]这22个数中,只有11和22是特别的数字,因此输出2

【评分标准】

对于20%的数据,保证1<=n<=100

对于40%的数据,保证1<=n<=100000

对于60%的数据,保证1<=n<=1e9

对于100%的数据,保证1<=n<=1e18

解题思路:

数据范围太大,不能枚举每个数进行判断,会超时,所以要寻找数字规律

解题关键是找到最大的特别数字
若n的位数是奇数,例:23152,10000-23152之间没有特殊的数字,所以最大的特别数字是9999;
若n的位数是偶数,分为两种情况:
左边小于等于右边,例:4345,最大的特别数字是4343,特别数字数是左边数字43;
左边大于右边,例:4643,最大特别数字是 4545,特别数字数是左边数字减一,45;

经验分享:

1.char【1e18】数组太长编译不通过,大整数要用string存储,string.length()获取大整数的位数
2.string可以直接通过大于小于符号进行比较
3.string.substr(x,y)截取string从x到y位的字符串
4.string转换为数字

方法一:
#include<string>
string a;
int b=stoi(a);
方法二:
#include<sstream>
string a;
stringstream stream(a);
int b;
stream >>b;

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string n;
	cin>>n;
	if(n.length()%2!=0)
	{
		for(int i=0;i<(n.length()/2);i++)
		cout<<9;
	}
	else
	{
		string left=n.substr(0,(n.length()/2));
		string right=n.substr((n.length()/2),n.length());
		if(left<=right) cout<<left;
		else
		{
			int m=0;
			stringstream stream(left);
			stream>>m;
			cout<<m-1;
		}
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值