题解

213 条题解

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

  • 8
    @ 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!
    点赞吧!

  • 6
    @ 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的祖传格式,可以百度一下,变量含义都差不多的。

  • 3
    @ 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\) ,撒花!

  • 3
    @ 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();
    }

  • 3
    @ 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--就是暴力,不多说了

  • 3
    @ 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;
    }
    
  • 2
    @ 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;
    }
    
     
    
  • 2
    @ 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)
    
  • 1
    @ 2024-08-27 20:08:27
    #include <iostream>
    using namespace std;
    int main(void) {
        int n, x, tmp, ans = 0;
        cin >> n >> x;
        for (int i = 1; i <= n; i++) {
            tmp = i;//保存数据
            while (tmp) {//数位拆分
                if (tmp % 10 == x)//找到了
                    ans++;//统计
                tmp /= 10;//数据除以10,找下一位
            }
        }
        cout << ans;
        return 0;
    }//已AC
    

    点个赞再走呗。

  • 1
    @ 2024-07-23 21:05:14

    AC代码
    思路分析:
    作为本人的第一篇题解,还是有点小激动的>_<
    1.输入数据
    2.数位分离+遍历 1-n (可以用 for 实现)
    3.累计答案 ANS

    Code
    cin,cout 版

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

    如果想再快一点,可以使用 scanf,printf 等函数,这里就不给出代码啦
    最后,分享一个链接,有兴趣的可以学学:快读快写(炸裂版)
    祝各位 RP++,AK NOI!
    Powered By 一个努力进步的蒟蒻
    2024.7.23晚

  • 1
    @ 2023-12-30 18:17:45
    #include<bits/stdc++.h>
    using namespace std;
    int n,x,sum;
    int main()
    {
        
        cin>>n>>x;
        int i=1;
        while(i<=n)
        {
            int k=i;
            while(k>0)
            {
                if(k%10==x) 
                    sum++;
                k/=10;
            }
            i++;
        }
        cout<<sum<<endl;
        return 0;
    }
    

    qwq

  • 1
    @ 2023-09-08 15:18:02
    #include<iostream>
    using namespace std;
    int main(){
        int n,x,t,k,ans=0;
        cin>>n>>x;
        for(int i=1;i<=n;i++){
            t=i;
            while(t){
                k=t%10;
                if(k==x)
                    ans++;
                t=t/10;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 0
    @ 2024-01-29 21:49:41
    #include<bits/stdc++.h>
    #define ull unsigned long long
    #define ll long long
    #define fo(i,l,r) for(int i=l;i<=r;i++)
    #define fd(i,r,l) for(int i=r;i>=l;i--)
    using namespace std;
    int a,b,ans;
    signed main(){
        cin>>a>>b;
        fo(i,1,a){
            int tmp=i;
            while(tmp)ans+=(tmp%10==b),tmp/=10;
        }
        cout<<ans;
        return 0;
    }
    
  • 0
    @ 2023-08-29 15:53:15

    n, x = input().split(' ')
    count = 0

    for i in range(1, int(n)+1):
    count += str(i).count(x)
    print(count)

  • 0
    @ 2023-05-30 20:10:00

    难度不大。
    核心代码:

    int a[42];  //存每个数字出现了几次
    void solve(int num){
        while(num){
            ans[num%10]++;
            num/=10;
        }
    }
    //分解num并存储
    

    完整代码:

    #include<bits/stdc++.h>
    using namespace std;
    int ans[42],num,x;
    void solve(int num){
        while(num){
            ans[num%10]++;
            num/=10;
        }
    }
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin>>num>>x;
        for(int i=1;i<=num;i++) solve(i);
        cout<<ans[x]<<endl;
        return 0;
    } 
    //@syhx
    
  • 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;
    }
    

信息

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