首页 > 试题广场 >

[NOIP2013]记数问题

[编程题][NOIP2013]记数问题
  • 热度指数:12362 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
试计算在区间1 n 的所有整数中,数字x0 ≤ x ≤ 9)共出现了多少次?
例如,在111 中,即在1234567891011 中,数字1 出现了4 次。

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


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

输入

11 1

输出

4

备注:
对于100%的数据,1≤ n ≤ 1,000,000,0 ≤ x ≤ 9。
#include<stdio.h>
int main()
{
    int n , x , mid_var0 , mid_var1 , mid_var2 , sum = 0 ;
    scanf("%d %d",&n,&x);
    for(int i = 1 ; i <= n ; i++)
    {
        mid_var0 = i ;
        while(mid_var0 != 0)
        {
            mid_var1 = mid_var0 % 10 ;
            if(mid_var1 == x) sum++;
            mid_var0 /= 10 ;
        }
    }
    printf("%d",sum);
    return 0;
}

发表于 2022-06-23 20:11:33 回复(0)
#include <iostream>
using namespace std;
int times(int n, int x)
{
    int cnt = 0;
    while (n)
    {
        int e = n % 10;
        if (e == x) cnt ++;
        n /= 10;
    }
    return cnt;
}

int main()
{
    int n, x;
    cin >> n >> x;
    int res = 0;
    for (int i = 1; i <= n; i ++ )
        res += times(i, x);
    cout << res << endl;

}

发表于 2022-02-26 14:26:15 回复(0)
m,n=map(int,input().split())
cc=''
for i in range(1,m+1):
    i=str(i)
    cc+=i
con=cc.count(str(n))
print(con)
发表于 2022-03-01 17:56:58 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args)
    {
        int n=0;
        int x=0;
        int cnt=0;
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        x=in.nextInt();
        for(int i=1;i<=n;i++)
        {
            int temp=i;
            while(temp!=0)
            {
                if(temp%10==x) cnt++;
                temp/=10;
            }
        }
        System.out.println(cnt);
    }
}

发表于 2022-07-20 17:47:57 回复(0)
哈希表
int main() {
    int hash[10] = {0}; //定义哈希表,范围0~9
    int n, x;
    scanf("%d %d", &n, &x);
    for (int i = 1; i <= n; i++) { //遍历区间
        int tem = i;
        while (tem) {      //计算
            hash[tem % 10]++;
            tem /= 10;
        }
    }
    printf("%d", hash[x]); //输出

}

发表于 2022-06-29 21:02:34 回复(0)
#include <stdio.h>

int main()
{
    int n, x;
    int count = 0;
    scanf("%d %d", &n, &x);

    for (int i = 1; i <= n; i++)//每一次循环判断一个数,直到n为止
    {
        int a = i;
        while (a)//利用while循环判断每一位数字,直到a等于0,
        {
            if (a % 10 == x)//如果个位上的数字是x,count加一
                count++;
            a /= 10;//将个位上的数字去除,十位上的数字变成个位上的数字
        }
    }

    printf("%d", count);
    return 0;
}

编辑于 2024-02-28 09:26:10 回复(0)
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),x=sc.nextInt();
        int count=0;
        for(int i=1;i<=n;i++)
            count+=total(i,x);
        System.out.println(count);
    }
    public static int total(int i,int x){
        int sum=0;
        while(i!=0){
            if(i%10==x) sum++;
            i/=10;
        }
        return sum;
    }
}

发表于 2022-08-09 21:29:42 回复(0)
#include <stdio.h>

void Judge(int i, int b, int* count){
    while(i > 0){
        if(i % 10 == b)
            *count += 1;
        i /= 10;
    }
 }   
int main(){
    int a, b;
    int count = 0;
    scanf("%d %d", &a, &b);
    for(int i = 1; i <= a; i++){
        Judge(i, b, &count);
    }
    printf("%d", count);
    return 0;

}

发表于 2022-05-27 17:11:10 回复(0)
凭我朴素的直觉,写了一个非常低效的答案,当反面例子看吧:
n,x = map(int,input().split())
t = 0
for i in range(1,n+1):
    for j in range(len(str(i))):
        if str(x) in str(i)[j]:
# 如果x在i的第j个字符出现,那t计数一次
            t += 1
        else:
            t = t
print (t)


#  会报错
# 运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。

参考了讨论区“我有一只猫”大佬的方法:
m,n=map(int,input().split())
cc=''
for i in range(1,m+1):
    i=str(i)
    cc+=i
    # 意思是把所有数字的文本先加在一起,组成一个名为cc的长文本,
con=cc.count(str(n))
# 再在cc之中用count,数n这个数字出现的次数
# 妙哇!
print(con)


发表于 2022-03-04 19:51:20 回复(0)
#include <stdio.h>

int main() 
{
    int n = 0;
    int x = 0;

    int count = 0;
    int i = 0;
    int tem = 0;

    scanf("%d%d", &n, &x);

    for(i = 0; i <= n; i++)
    {
        //取i的各个位,与n进行比较
        tem = i;
        while(tem)
        {
            if(tem % 10 == x)
            {
                count++;
            }
            tem /= 10;
        }
    }


    printf("%d\n", count);

    return 0;
}

编辑于 2024-04-02 22:27:28 回复(0)
#include <stdio.h>

int main() {
    int n, m;
    int count = 0;
    while (scanf("%d%d", &n, &m)==2) {
        if (m <= 9) {
            count++;
        }
        int i;
        for (i = 10; i <= n; i++) {
            int temp=i;
                while (temp) {
                    if (m == temp%10) {
                        count++;
                    }
                    temp /= 10;
                }
            }
    }
    printf("%d", count);
    return 0;
}
发表于 2024-03-21 20:17:54 回复(0)
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int x = in.nextInt();
            int count = 0;
            for (int i = 1; i <= n; i++) {
                count += sumX(String.valueOf(i), String.valueOf(x));
            }
            System.out.println(count);
        }
    }
    static int sumX(String i, String x ) {
        int sum = 0;
        Pattern p = Pattern.compile(x);
        Matcher m = p.matcher(i);
        while (m.find()) {
            sum++;
        }
        return sum;
    }
}

发表于 2024-03-01 22:06:44 回复(0)
使用join()函数将列表中的所有元素合并为一个字符串
n,x=map(int,input().split())
a = [str(i) for i in range(1,n+1)]
b = "".join(a)
print(b.count(str(x)))


编辑于 2024-02-06 14:07:39 回复(0)
#include <stdio.h>
void fun(int i, int x, int* p) {
    int a;
    while (i) {
        a = i % 10;
        i = i / 10;
        if (a == x) {
            (*p)++;
        }
    }
}
int main() {
    int n = 0, x = 0, count = 0;
    int arr[1000] = { 0 };
    scanf("%d %d", &n, &x);
    for (int i = 0; i <= n; i++) {
        arr[i] = i;
    }

    for (int i = 0; i <= n; i++) {
        fun(i, x, &count);
    }
    printf("%d", count);
    return 0;
}//看着唬人,其实很好理解
发表于 2023-12-28 13:38:24 回复(0)
package main

import (
    "fmt"
)

func main() {
    var n, x int
    fmt.Scan(&n, &x)
    var ans = 0
    for i := 1; i <= n; i++ {
        t := i
        for t > 0 {
            if t%10 == x {
                ans++
            }
            t /= 10
        }
    }
    fmt.Println(ans)
}
发表于 2023-12-24 02:33:11 回复(0)
#include <stdio.h>
int main() {
    int n = 0;
    int x = 0;
    int t = 0;
    int m = 0;

    int count = 0;

    scanf("%d %d", &n, &x);
    for (int i = 1; i <= n; i++) {
        int m = i;
        while (m != 0) {
            t = m % 10;
            m = m / 10;
            if (t == x)
                count ++;
        }
    }
    printf("%d", count);

}
//大神的代码
//点个赞

编辑于 2023-12-12 16:41:53 回复(0)
#include <stdio.h>

int main()
{
    int n = 0;//1~n
    int x = 0;//数字x
    scanf("%d %d",&n,&x);
    int count = 0;//x出现次数
    int i = 0;
    for(i=1;i<=n;i++)//n个数字
    {
        int k = i;
        while(k)
        {
            if(k%10==x)
            count++;
            k/=10;
        }
    }
    printf("%d",count);    
    return 0;
}

发表于 2023-12-11 10:20:42 回复(0)
#include <stdio.h>
int main()
{
    int n,x,count = 0;
    scanf("%d %d ",&n,&x);
    for(int i=1;i<=n;i++)
    {
        int m = i;//如果不用另一个变量替换i,i就会被小循环内的运算改变,影响大循环
        while(m)
        {
            if(m%10==x)
            {
                count++;
            }
            m /= 10;
        }
    }
    printf("%d",count);
    return 0;
}

发表于 2023-11-06 09:14:30 回复(0)
#include <iostream>
using namespace std;

int main() {
    int n,x;
    int a =0;
    scanf("%d %d",&n,&x);// 注意 while 处理多个 case
    for(int i=1;i<=n;i++){
        int j=i;
        while(j>0){
            if(j%10==x)
            a++;
            j /= 10;
            }
        }
        printf("%d\n",a);
    }

// 64 位输出请用 printf("%lld")

发表于 2023-10-10 16:38:50 回复(0)
#include <stdio.h>

int count_numofx(int n, int x)
{
    int count = 0;
    int i = 0;
    for (i = 1; i <= n; i++)
    {
        int a = i;
        while (a)
        {
            if (a % 10 == x)
            {
                count++;
            }
            a /= 10;
        }
    }
    return count;
}

int main()
{
    int n = 0;
    int x = 0;
    scanf("%d %d", &n, &x);
    int ret = count_numofx(n, x);
    printf("%d\n", ret);
    return 0;
}

发表于 2023-09-03 14:57:16 回复(0)