AtCoder題解 —— AtCoder Beginner Contest 186 —— C - Unlucky 7 —— 模擬演算法
技術標籤:OJ題解# AtCoder題解AtCoder題解ABC186C題Unlucky 7
題目相關
題目連結
AtCoder Regular Contest 186 C 題,https://atcoder.jp/contests/abc186/tasks/abc186_c。
Problem Statement
Takahashi hates the number 7.
We are interested in integers without the digit 7 in both decimal and octal. How many such integers are there between 1 and N (inclusive)?
Input
Input is given from Standard Input in the following format:
N
Output
Print an integer representing the answer.
Sample 1
Sample Input 1
20
Sample Output 1
17
Explaination
Among the integers between 1 and 20, 7 and 17 contain the digit 7 in decimal. Additionally, 7 and 15 contain the digit 7 in octal.
Sample 2
Sample Input 2
100000
Sample Output 2
30555
Constraints
- 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^{5} 1≤N≤105
- N is an integer.
題解報告
題目翻譯
高橋討厭數字 7。請告訴我們從 [ 1 , n ] [1, n] [1,n] 之間,有幾個陣列不包含數字 7,不管是十進位制還是八進位制。
題目分析
本次的 C 題比較簡單,一個非常普通的模擬題。我們只需要從 1 到 N 之間統計一下,不管十進位制還是八進位制數字 i 包含 7 的個數 ans,最終答案為
n
−
a
n
s
n-ans
如何判定包含數字 7
最簡單的方法是轉化稱為 string,然後利用 find 函式。
將數字轉化稱為十進位制字串
我們可以使用 sprintf 函式,只需要使用引數 %d 即可完成。程式碼類似如下:
sprintf(buf, "%d", i);
將數字轉化稱為八進位制字串
我們可以使用 sprintf 函式,只需要使用引數 %o 即可完成。程式碼類似如下:
sprintf(buf, "%o", i);
資料範圍估計
根據題目,最大的 N N N 為 1 0 5 10^5 105,因此用 int 也就夠了。
AC 參考程式碼
//https://atcoder.jp/contests/abc186/tasks/abc186_c
//C - Unlucky 7
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
//#define __LOCAL
int main() {
#if !defined(__LOCAL)
cin.tie(0);
ios::sync_with_stdio(false);
#endif
int n;
cin>>n;
char buf[10];
int ans = 0;
for (int i=1; i<=n; i++) {
//十進位制
sprintf(buf, "%d", i);
string s=string(buf);
if (string::npos != s.find('7', 0)) {
ans++;
} else {
//二進位制
sprintf(buf, "%o", i);
s=string(buf);
if (string::npos != s.find('7', 0)) {
ans++;
}
}
}
cout<<n-ans<<"\n";
return 0;
}
時間複雜度
O(N)。
空間複雜度
O(1)。