1. 程式人生 > >愛奇藝2018秋季校招C++ [程式設計題]奇異數

愛奇藝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 <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	long long left, right;
	long sum = 0;
	cin >> left >> right;
	long dvalue;
	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;
}