愛奇藝2018秋季校招C++ [程式設計題]奇異數
阿新 • • 發佈:2018-11-11
連結: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; }