题解

192 条题解

  • 13
    @ 2018-12-03 15:41:32
    #include<iostream>
    using namespace std;
    int main(){
        int n,x,sum=0;
        cin>>n>>x;
        for(int i=1;i<=n;i++){
            int t=i;
            while(t>0){
                if(t%10==x) sum++;
                t/=10;
            }
        }
        cout<<sum<<endl;
        return 0;
    }
    
  • 12
    @ 2017-02-26 13:33:44

    #include <stdio.h>

    int main()
    {
    int i,n,x,k=0,j;
    scanf("%d %d",&n,&x);
    for(i=1;i<=n;i++)
    {
    j=i;
    while(j)
    {
    if(j%10==x)
    k++;
    j=j/10;

    }

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

  • 5
    @ 2019-08-18 15:16:54

    还是先分析思路:
    1. 输入数据,终止点和查找字符
    2. for循环判断

    1. 定义临时判断数据temp,将它的值设为控制器i的值
    2. while循环

    1. 条件:temp > 0(原因后面再说)
    2. 如果temp的末位是x,则ans++,然后temp去掉末位继续判断(原因知道了吧)
    3.输出ans

    //C++
    #include <iostream>
    using namespace std;
    
    int main()
    {
      int n,x,ans = 0;
        cin >> n >> x;
        for(int i = 1;i <= n;i++)
        {
            int temp = i;
            while(temp > 0)
            {
                if(temp % 10 == x)
                {
                    ans++;
                }
                temp /= 10;
            }
        }
        cout << ans << endl;
    }
    

    这题比较简单,稍微有些基础的人就可以做出来
    祝大家AC!
    点赞吧!

  • 4
    @ 2020-08-01 19:17:28

    数位dp写法,全部1ms

    #include <bits/stdc++.h>
    #define fu(a, b, c) for (int a = b; a <= c; a++)
    #define fd(a, b, c) for (int a = b; a >= c; a--)
    using namespace std;
    int a[10],dp[10][10][2],n,q,cnt;
    
    int dfs(int pos,int sta,int pre,int limit) {
        if(pos==-1)
            return sta;
        if(!limit&&dp[pos][sta][pre]!=-1) {
            return dp[pos][sta][pre];
        }
        int up=limit?a[pos]:9,tmp=0;
        fu(i,0,up) {
            int nsta=sta+(i==q);
            if(!q&&!pre)
                nsta=sta;
            tmp+=dfs(pos-1,nsta,i||pre,limit&&i==a[pos]);
        }
        if(!limit)
            dp[pos][sta][pre]=tmp;
        return tmp;
    }
    
    int solve(int x) {
        cnt=0;
        memset(dp,-1,sizeof dp);
        while(x) {
            a[cnt++]=x%10;
            x/=10;
        }
        return dfs(cnt-1,0,0,1);
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n>>q;
        cout<<solve(n)<<'\n';
    }
    
    
    
    • @ 2020-10-27 20:25:29

      大佬能不能加个注释...
      刚学dp的我看不懂...

    • @ 2020-12-21 22:02:50

      @saaaaad: 这个是数位dp的祖传格式,可以百度一下,变量含义都差不多的。

  • 2
    @ 2021-08-27 17:59:39
    //哪里不是纯模拟了(附上题面喽)
    #include<bits/stdc++.h>
    using namespace std;
    int main() {
        int a,m,t=0,d;
        cin>>a>>m;
        for(int i=1; i<=a; i++) {
            d=i;
            while(d>=10) {//统计d中的数字
                if(d%10==m) t++;
                d=d/10;
            }
            if(d==m) t++;
        }
        cout<<t;
        return 0;
    }
    /*
    记数问题
    描述
    试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1 到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,数字 1 出现了 4 次。
    
    格式
    输入格式
    输入共 1 行,包含 2 个整数 n、x,之间用一个空格隔开。
    
    输出格式
    输出共 1 行,包含一个整数,表示 x 出现的次数。
    
    样例1
    样例输入1
    11 1
    
    Copy
    样例输出1
    4
    
    Copy
    限制
    每个测试点1s。
    
    提示
    对于 100%的数据,1≤ n ≤ 1,000,000,0 ≤ x ≤ 9。
    
    来源
    NOIP 2013 普及组
    */
    
    • @ 2021-08-27 18:03:37

      e--就是暴力,不多说了

  • 2
    @ 2021-03-13 10:16:51

    暴力出奇迹

    #include<iostream>
    using namespace std;
    int main(){
        long long a,b,c=0;
        cin>>a>>b;
        int ans=0;
        for(int i=1;i<=a;i++){
            c=i;
            while(c>0){
                if(c%10==b){
                    ans++;
                }
                c=c/10;
            }
        }
        cout<<ans;
        return 0;
    }
    
  • 1
    @ 2020-12-22 16:33:47

    我永远爱CSDN
    https://blog.csdn.net/beguile/article/details/103635707 学的函数
    Python 永远的神
    三行哈哈哈哈

    TempNum = input().split(' ')
    list1 = str(list(range(1,int(TempNum[0])+1)))
    print(list1.count(TempNum[1]))
    

    所以python永远的神(bushi)
    暴力(会超时)

    TempStr = input()
    TempNum = TempStr.split(' ')
    n = int(TempNum[0])
    x = int(TempNum[1])
    ans = 0
    for i in range(1,n+1):
        Temp = i
        while(Temp>0):
            if (Temp%10==x):
                ans+=1
            Temp//=10
    print(ans)
    
  • 0
    @ 2021-07-13 10:23:29

    #include <iostream>
    using namespace std;
    int main()
    {
    int n,x,sum=0;
    cin>>n>>x;
    for(int i=1; i!=(n+1); i++){
    for(int t=i;t!=0;t/=10){
    if((t%10)==x){
    sum++;
    }
    }
    }
    cout<<sum<<endl;
    return 0;
    }

  • 0
    @ 2021-05-18 09:20:09
    import java.io.*;
    import java.util.*;
    
    
    /**
     * @author wpx
     * @version V1.0
     * @Package com.test
     * @date 2021/5/17 14:13
     */
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
            int endNum = sc.nextInt();
            int findNum = sc.nextInt();
            int[] fixedZeroNum = new int[]{0, 9, 108, 1107, 11106, 111105, 1111104, 11111103};
            int[] zeroCountNum = new int[]{0, 1, 11, 111, 1111, 11111, 111111, 1111111};
            // 先转换为字符串
            String endNumStr = String.valueOf(endNum);
            int strEndPos = endNumStr.length() - 1;
            int count = 0;
            // 从前往后
            for(int i = 0; i < endNumStr.length(); i++){
                // 按照千位、百位、十位、个位的顺序
                // 对应位置上的数字
                Integer num = Integer.parseInt(String.valueOf(endNumStr.charAt(i)));
                // 位数
                int digitNum = strEndPos - i;
                int preCount;
                if (findNum == 0) {
                    // 特殊处理
                    if(digitNum == 0){
                        preCount = 0;
                    } else {
                        preCount = (int) ((digitNum - 1 ) * Math.pow(10, digitNum - 1));
                        preCount -= zeroCountNum[digitNum - 1];
                    }
                } else {
                    preCount = (int) (digitNum * Math.pow(10, digitNum -1));
                }
    
                if(findNum != 0){
                    if(num > findNum){
                        // 加上累计值
                        count += num * preCount;
                        // 加上以findNum开头的数量
                        count += (int) Math.pow(10, digitNum);
                    } else if (num < findNum) {
                        // 加上累计值
                        count += num * preCount;
                    } else {
                        count += num * preCount;
                        if(i + 1 < endNumStr.length()) {
                            count += Integer.parseInt(endNumStr.substring(i + 1));
                        }
                        count += 1;
                    }
                } else {
                    count += num * (preCount + digitNum); 
                    // 补上一位的0
                    if(num - 1 > 0 && digitNum - 1 >= 0){
                        count += (num - 1) * fixedZeroNum[digitNum - 1];
                    }
                    // 补0
                    if(i != 0 && num - 1 > 0){
                        count += fixedZeroNum[digitNum];
                    }
                }
    
            }
            System.out.println(count);
        }
    }
    
  • 0
    @ 2021-03-25 20:31:23
    #include<iostream>
    using namespace std;
    class sde{
        public:
            int qumo(int n)
            {
                return n%10;
            }
            int geshu(int *n,int *x)
            {
                int cnt=0;
                for(int i=1;i<=*n;i++)
                {
                    int nn=i;
                    while(nn>=1)
                    {   
                        int m=qumo(nn);
                        nn/=10;
                        if(m==*x)
                            cnt++;
                    }
                }
                
                return cnt;
            }
        private:
    }k;
    int main()
    {
        int n,x;scanf("%d%d",&n,&x);
        int cnt=k.geshu(&n,&x);
        printf("%d",cnt);
        return 0;
    }
    
  • 0
    @ 2021-01-20 21:25:31

    python直接用str中的count方法

    n,x = map(int,input().split())
    sum = 0
    for i in range(1,n+1):
        if str(x) in str(i):
            b = str(i).count(str(x))
            sum+=b
    print(sum)
    
    
  • 0
    @ 2020-12-27 21:19:52

    #include <iostream>
    using namespace std;
    int main()
    {
    int n,x,i,t,ans=0;
    cin>>n>>x;
    for(i=1;i<=n;i++){
    t=i;
    while(t>0){
    if(t%10==x){
    ans++;
    }
    t/=10;
    }
    }
    cout<<ans;
    return 0;
    }

  • 0
    @ 2020-11-21 18:03:59
    #include <cstdio>
    
    int n,m,s;
    
    int pd(int x)
    {
        while (x!=0)
        {
            if (x%10==m) s++;
            x/=10;
        }
    }
    
    int main()
    {
        scanf("%d%d", &n,&m);
        for (int i=1;i<=n;i++) pd(i);
        printf("%d", s);
        return 0;
    }
    
  • 0
    @ 2020-09-12 19:09:29
    #include <stdio.h>
    
    int main(){
        int n;
        char x;
        char str[10];
        scanf("%d %c",&n,&x);
        int count=0;
        for (int i=1;i<=n;i++){
            sprintf(str,"%d",i);
            char *go=str;
            while(go[0]){
                if (go[0]==x){
                    count++;
                }
                go++;
            }
        }
        printf("%d\n",count);
        return 0;
    }
    
    
  • 0
    @ 2020-08-25 22:54:12

    请在代码中细看,有很多注释

    #include<cstdio>
    #include<iostream>
    const int N = 100000000 + 10;
    char a[N];
    //#define _DEBUG_ //把这一句删了或者注释了都可以直接去掉日志输出
    using namespace std;
    int main()
    {
        int end,needle;//采用大海捞针的思想
        int cnt = 0;//统计
        cin >> end >> needle;//输入
        //freopen("output.out", "w", stdout);
        for (int i = 1; i <= end; i++)//sea
        {
    #ifdef _DEBUG_
            cout << "searching " << i << endl;
    #endif
            if (i < 10)//如果是一位数
            {
                if (i == needle)//比较
                {
                    cnt++;//统计
    #ifdef _DEBUG_
                    cout << "   successfully found member in " << i << endl;
    #endif
                }
            }
            else//大于两位数
            {
                int x = i;//拿取数据
                /*采用的思想:
                    如果 当前循环的数 还是两位数
                    那么
                        如果 当前循环的数的最后一位 和查找对象 不相等
                            那么扔掉最后一位
                        否则 统计并扔掉最后一位
                    否则 跳出循环
                */
                    
                while (x >= 10)//开始循环...
                {
                    if (x % 10 != needle)//拿取最后一位进行比较
                    {
                        x /= 10;//如果不是,那么扔掉最后一位
                    }
                    else
                    {
    #ifdef _DEBUG_
                        cout << "   successfully found member in " << i << endl;
    #endif
                        x /= 10;
                        cnt++;
                    }
                }
                if (x == needle)
                {
                    cnt++;
    #ifdef _DEBUG_
                    cout << "   successfully found member in " << i << endl;
    #endif
                }
            }
        }
        //fclose(stdout);
        cout << cnt << endl;
        return 0;
    }
    
  • 0

    方法一:暴力

    代码:

    var
     n,x,i,j,s:longint;
    begin
     readln(n,x);
     for i:=1 to n do
      begin
       j:=i;
       while j>0 do
        begin
         if j mod 10=x then inc(s);
         j:=j div 10;
        end;
      end;
     write(s);
    end.
    

    方法二:dp

    代码:

    var
     n,x,i,s:longint;
     a:array[0..10000003] of longint;
    begin
     readln(n,x);
     for i:=1 to n do
      if i mod 10=x then a[i]:=a[i div 10]+1
       else a[i]:=a[i div 10];
     for i:=1 to n do s:=s+a[i];
     write(s);
    end.
    
    
  • 0
    @ 2020-07-28 12:18:10

    #include <stdio.h>
    int main()
    {
    int i,j,z,x,sum=0;;
    scanf("%d %d",&i,&j);
    for(z=1;z<=i;z++)
    {
    x=z;
    do{
    if(x%10==j)
    sum++;
    x=x/10;
    }
    while(x>0);

    }
    printf("%d",sum);
    }

  • 0
    @ 2019-09-06 14:47:52

    #include <stdio.h>

    int main()
    {
    int n,x;
    int num = 0;
    int i;
    int temp;
    scanf("%d %d",&n,&x);
    for(i = 1;i <= n;i++)
    {
    temp = i;
    do
    {
    if(temp % 10 == x)
    num++;
    temp /= 10;
    }
    while(temp);
    }
    printf("%d\n",num);
    }

  • 0
    @ 2019-02-17 16:31:21

    第一次写题解,dalao不要见笑~刚学半年,程序可能不是最简的
    附上代码:
    /*
    思路(dalao不要见笑):
    1.输入
    2.数据处理
    2.1 i:循环从1到n;
    2.2 备份i;
    2.3 求个数
    3.输出
    */
    #include<iostream>
    //#include<string>
    //#include<cstring>我的缺省源自己搞出来的
    using namespace std;
    int c;//全局变量自动归零(:
    int main()
    {
    int n,x,temp;//nx不用说了,temp临时做数据处理用
    cin>>n>>x;
    for(int i=1;i<=n;i++)
    {
    int temp=i;//备份(i循环还要使用);
    while(temp>0)
    {
    if(temp%10==x)
    c++;
    temp/=10;//直到/10后小于0才结束;
    }
    }
    cout<<c;
    return 0;
    }

  • 0
    @ 2018-05-10 21:08:27

    C++ ac,老人小孩都看的懂

    #include<iostream>
    using namespace std;

    int main()
    {
    int n,m,s=0,i,t,t1;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
    t=i;
    while(t>0)
    {
    t1=t%10;
    if(t1==m) s++;
    t=t/10;
    }
    }
    cout<<s;
    }

信息

ID
1848
难度
5
分类
(无)
标签
递交数
15276
已通过
5376
通过率
35%
被复制
24
上传者