特别的数字
【问题描述】
定义一种特别的数字,它的左半部分和它的右半部分完全一样,例如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;
}
}
}