链接:https://www.nowcoder.com/questionTerminal/7442938f5012486499ddd61ce16f9086 来源:牛客网
如果一个数字满足以下条件,我们就称它为奇异数:
1、这个数字至少有两位
2、这个数的最低两位是相同的
比如: 1488是一个奇异数,而3、112不是。
牛牛现在给出一个一个区间[L,R],让你计算出在区间内有多少个奇异数
输入描述:
输入包括两个正整数L和R(1 ≤ L ≤ R ≤ 10^12),以空格分割。
输出描述:
输出一个正整数,即区间内的奇异数的个数。
示例1
输入
10 20
输出
1
解题思路:满足题目要求的奇异数,形式类似于11,22,33,44,...,100,111,122,...,199,200,...1000,...,1100.等。
每100个数之间有9个,100本身也算一个。
以范围[1111111 111111111]为例,我先计算出1111111到1111200之间有9个奇异数,超过111111100的部分有1个奇异数。
然后,计算1111200到111111100之间有几个100,每个100里面又有9个11,加起来就是要求的结果。
范围比较大,定义int会溢出,改成long long类型好了
#include <iostream>
using namespace std;
int main()
{
long long left, right;
long sum = 0;
cin >> left >> right;
long left1 = 0, left2 = 0;//最后一位和倒数第二位
if (right <= 10) {
sum = 0;
cout << sum;
return 0;
}
if (left < 10) left = 10;
//从左往右找到第一个满足条件的数 //掐头去尾,计算中间有多少个100,多少个11,再加上两边的11的个数
left1 = left - left / 10 * 10;
left2 = left / 10 - left / 10 / 10 * 10;
if (left1 == left2) sum = 1;
else if (left2 < left1) {
if (left / 100 * 100 + (left2 + 1) * 10 + ((left2 + 1)) <= right) {
left = left / 100 * 100 + (left2 + 1) * 10 + ((left2 + 1));
sum = 1;
}
}
else {
if (left / 10 * 10 + left2 <= right) {
left = left / 10 * 10 + left2;
sum = 1;
}
}
if (left - left % 100 + 100 > right)
sum += (right - left % 100) / 11;
else {
sum += (100 - left % 100) / 11;
sum += right % 100 / 11;
long long count100 = ((right - right % 100) - (left - left % 100 + 100)) / 100;
long long count11 = count100 * 9;
sum += count100 + count11 + 1;//少算了最开始的一个100
}
cout << sum;
return 0;
}