1. 程式人生 > 其它 >AtCoder題解 —— AtCoder Beginner Contest 186 —— C - Unlucky 7 —— 模擬演算法

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.

Thus, the 17 integers other than 7, 15, and 17 meet the requirement.

Sample 2

Sample Input 2

100000

Sample Output 2

30555

Constraints

  • 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^{5} 1N105
  • N is an integer.

題解報告

題目翻譯

高橋討厭數字 7。請告訴我們從 [ 1 , n ] [1, n] [1,n] 之間,有幾個陣列不包含數字 7,不管是十進位制還是八進位制。

題目分析

本次的 C 題比較簡單,一個非常普通的模擬題。我們只需要從 1 到 N 之間統計一下,不管十進位制還是八進位制數字 i 包含 7 的個數 ans,最終答案為 n − a n s n-ans

nans

如何判定包含數字 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)。