列表

详情


BC116. [NOIP2013]记数问题

描述

试计算在区间1 n 的所有整数中,数字x0 ≤ x ≤ 9)共出现了多少次?
例如,在111 中,即在1234567891011 中,数字1 出现了4 次。

输入描述

输入共1行,包含2个整数n、x,之间用一个空格隔开。

输出描述

输出共1行,包含一个整数,表示x出现的次数。

示例1

输入:

11 1

输出:

4

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2022-05-05

#include <stdio.h>


int main() {
    int num = 0;
    int F = 0;
    int loc = 1;
    int cnt = 0;
    scanf("%d%d", &num, &F);
    while(loc <= num) {
        int left = num / loc / 10;
        int right = num % loc;
        int cur = num / loc % 10;
        if (F) {
            cnt += left * loc;
        }
        if (!F && left) {
            cnt += (left - 1) * loc;
        }
        if (cur > F && (F || left)) {
            cnt += loc;
        }
        if (cur == F && (F || left)) {
            cnt += right + 1;
        }
        loc *= 10;
    }
    printf("%d", cnt);
}

C 解法, 执行用时: 3ms, 内存消耗: 332KB, 提交时间: 2022-08-01

#include <stdio.h>


int main() {
    int num = 0;
    int F = 0;
    int loc = 1;
    int cnt = 0;
    scanf("%d%d", &num, &F);
    while(loc <= num) {
        int left = num / loc / 10;
        int right = num % loc;
        int cur = num / loc % 10;
        if (F) {
            cnt += left * loc;
        }
        if (!F && left) {
            cnt += (left - 1) * loc;
        }
        if (cur > F && (F || left)) {
            cnt += loc;
        }
        if (cur == F && (F || left)) {
            cnt += right + 1;
        }
        loc *= 10;
    }
    printf("%d", cnt);
}

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-07-22

#include<iostream>
using namespace std;

int main() {
    int n, x;
    cin >> n >> x;
    int loc = 1, cnt = 0;
    while(loc <= n) {
        int left = n / loc / 10;
        int right = n % loc;
        int cur = n / loc % 10;
        if(x) cnt += left * loc;
        if(!x && left) cnt += (left-1)*loc;
        if(cur > x && (x || left)) cnt += loc;
        if(cur == x && (x || left)) cnt += right + 1;
        loc *= 10;
    }
    cout << cnt;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-02-25

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, x;
    cin >> n >> x;
    int loc = 1, cnt = 0;
    while(loc <= n) {
        int left = n / loc / 10;
        int right = n % loc;
        int cur = n / loc % 10;
        if(x) cnt += left * loc;
        if(!x && left) cnt += (left-1)*loc;
        if(cur > x && (x || left)) cnt += loc;
        if(cur == x && (x || left)) cnt += right + 1;
        loc *= 10;
    }
    cout << cnt;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 416KB, 提交时间: 2022-03-04

#include <bits/stdc++.h>
using namespace std;
 
int main() {
    int n, x;
    cin >> n >> x;
    int loc = 1, cnt = 0;
    while(loc <= n) {
        int left = n / loc / 10;
        int right = n % loc;
        int cur = n / loc % 10;
        if(x) cnt += left * loc;
        if(!x && left) cnt += (left-1)*loc;
        if(cur > x && (x || left)) cnt += loc;
        if(cur == x && (x || left)) cnt += right + 1;
        loc *= 10;
    }
    cout << cnt;
}

上一题