题解

202 条题解

  • 14
    @ 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;
    }

  • 6
    @ 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-12-30 14:10:15

    //字符串也行
    #include<iostream>
    using namespace std;
    #include<string>
    void test106()
    {
    int n;
    int x;
    cin >> n >> x;
    int count = 0;
    for (int i = 1; i <= n; i++)
    {
    string f = to_string(i);
    for (int i = 0; i < f.size(); i++)
    {
    if ((f[i]-'0') == x)
    count++;

    }

    }

    cout << count << endl;

    }
    int main()
    {
    test106();
    }

  • 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;
    }
    
  • 0
    @ 2022-09-30 20:40:05
    //题目给的n的范围是10^7这么大,所以时间复杂度要在O(n)左右
    #include<iostream>
    using namespace std;
    int main(){
        int n,x,ans=0;
        cin>>n>>x;
        for(int i=1;i<=n;i++){
            //用s存i防止出问题无限循环
            int s=i;
            while(s){//如果s不为零就一直循环
                if(s%10==x)ans++;//取最后一位,如果和x一样,ans++
                s/=10;//把最后一位删了
            }
            //输出ans
        }
        cout<<ans;
        return 0;
    }
    
    
  • 0
    @ 2022-06-24 20:59:33

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

    }
    cout<<sum;
    }

  • 0
    @ 2022-06-23 17:30:04
    #include <iostream>
    using namespace std;
    int main()
    {
        int n,res=0,m;
        cin >> n >> m;
        for (int i = 1;i <= n;i ++)
        {
            int ans = i;
            while (ans > 0)
            {
                if (ans % 10 == m)
                {
                    res ++;
                }
                ans /= 10;
            }
        }
        cout << res;
        return 0;
    }
    
  • 0
    @ 2022-05-08 17:57:13
    1. 输入 \(n,x\)
    2. 遍历 \(1\) ~ \(n\)
    3. 分解枚举到的数,求出每一位
    4. 依次判断是否与 \(x\) 相等

    分解代码:

    //t为要分解的数
    //x即为题中原意
    //ans为x在t中的数量
    while (t) //t不为0
    {
        if (t % 10 == x) //如果t的最后一位等于x
        {
            ans ++ ; //ans加1
        }
        t /= 10; //t每次去掉最后一位
    }
    

    完整代码:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    
    int main()
    {
        int n, x, t, ans = 0; //注意ans初始化0
        scanf("%d%d", &n, &x); //输入
        for (int i = 1; i <= n; i ++ ) //遍历
        {
            t = i; //不能把i直接分解,因为如果这样,i在分解过程中数值就会改变,遍历的过程就会出现问题
            while (t) //t不为0
            {
                if (t % 10 == x) //如果t的最后一位等于x
                {
                    ans ++ ; //ans加1
                }
                t /= 10; //t每次去掉最后一位
            }
        }
        printf("%d", ans); //输出结果
        return 0;
    }
    

    完美 \(AC\) ,撒花!

  • 0
    @ 2021-11-03 08:46:28
    #include <stdio.h>
    int main(){
        
        int startnum,target,n,aray[10]={0};
        
        scanf("%d %d",&startnum,&target);
        
        for(;startnum;startnum--)
            for(n=startnum;n;n/=10)
                aray[n%10]++;
                
        printf("%d",aray[target]);
        
        return 0;
    }
    
     
    
  • 0
    @ 2021-10-24 11:27:15

    就枚举每个数字之中有多少个目标的数就行了复杂度 \(O(nlgn)\)。
    ```
    #include<stdio.h>

    int n,x;
    int ans;

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

  • 0
    @ 2021-10-22 14:14:36

    #include<iostream>
    using namespace std;
    int main()
    {
    int a,b=0,c,e;
    cin>>a>>c;
    for(int i=1;i<=a;i++)
    {
    e=i;
    while(e>0)
    {
    if(e%10==c)
    b+=1;
    e=e/10;
    }
    }
    cout<<b;
    }

  • 0
    @ 2021-10-11 16:38:13

    n,x=input().split()
    res=0
    for i in range(1,int(n)+1):
    res+=str(i).count(x)

    print(res)

  • 0
    @ 2021-10-11 16:37:22

    n,x=input().split()
    res=0
    for i in range(1,int(n)+1):
    res+=str(i).count(x)

    print(res)

  • 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)
    
    

信息

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