爱奇艺2018秋季校招C++ [编程题]奇异数

链接: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 
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;
}

 

你可能感兴趣的:(爱奇艺2018秋季校招C++ [编程题]奇异数)