11 条题解

  • 8
    @ 2023-4-30 13:21:55

    入门题解:

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int l, r, num = 0, x;
    	cin >> l >> r;
    	for(int i = l; i <= r; i++)
    	{
    		x = i;
        	while(x > 0)
        	{
            	if(x % 10 == 2)
    		    {
                    num++;
    		    }
            	x /= 10;
        	}
    	}
    	cout << num;
    	return 0;
    }
    
    • 5
      @ 2022-9-25 13:35:09

      题前吐槽

      这叫2010!!!简单过头了哈!

      题解

      这个题目,看起来难。其实我们枚举 LLRR,然后对每一个数都拆解(使用int转string的方法逐位拆开)。 过于简单直接上代码(注释里有更详细的)

      #include <bits/stdc++.h>
      using namespace std;
      int L, R, ans;
      int check(int num) // 计算一个数字的2含量
      {
          int ans = 0;
          while (num > 0)
          {
              ans += (num % 10) == 2; // 拆出来的一位如果相同就让ans加一
              num /= 10;
          }
          return ans;
      }
      int main()
      {
          scanf("%d%d", &L, &R);
          for (int i = L; i <= R; i++)
          {
              ans += check(i); // 枚举、计算、相加
          }
          printf("%d\n", ans);
          return 0;
      }
      

      很简单有没有。

      ACAC CodeCode

      #include <bits/stdc++.h>
      using namespace std;
      int L, R, ans;
      int check(int num)
      {
          int ans = 0;
          while (num > 0)
          {
              ans += (num % 10) == 2;
              num /= 10;
          }
          return ans;
      }
      int main()
      {
          scanf("%d%d", &L, &R);
          for (int i = L; i <= R; i++)
          {
              ans += check(i);
          }
          printf("%d\n", ans);
          return 0;
      }
      

      延伸与拓展

      这个题太氵了,于是我们把 22 改成了 kk可是依旧很氵

      #include <bits/stdc++.h>
      using namespace std;
      int L, R, ans, k;
      int check(int num)
      {
          int ans = 0;
          while (num > 0)
          {
              ans += (num % 10) == k;
              num /= 10;
          }
          return ans;
      }
      int main()
      {
          scanf("%d%d%d", &L, &R, &k);
          for (int i = L; i <= R; i++)
          {
              ans += check(i);
          }
          printf("%d\n", ans);
          return 0;
      }
      

      直接改一下就可以了。

      如何计算时间复杂度:

      这个题的时间复杂度比较难算,就是最大数字位数 * 最大数字个数,我们可以通过 log10(N)log_{10}(N) 来计算 NN 的位数。 所以时间复杂度就是 O(Nlog10(N))O(Nlog_{10}(N)) 了。

      • 4
        @ 2023-7-31 10:23:33
        #include <bits/stdc++.h>
        using namespace std;
        int main()
        {
            int l, r, sum = 0;
            cin >> l >> r;
            for (int i = l; i <= r; i++)
            {
                int x = i;
                while(x)
                {
                    if (x % 10 == 2)
                        sum++;
                    x /= 10;
                }
            }
            cout << sum;
            return 0;
        }
        
        • 3
          @ 2022-12-27 8:53:16

          俗话说的好,套公式少不了 · · · · · ·

          上代码!

          #include <iostream>
          #define ll long long
          using namespace std;
          ll f(ll n, ll num)
          {
              ll base = 1, cnt = 0;
              while (base <= n)
              {
                  ll pre = n/(base*10), suf = n%base, now = n/base%10;
                  if (now < num)
                      cnt += pre * base;
                  else if (now == num)
                      cnt += pre * base + suf + 1;
                  else
                      cnt += (pre + 1) * base;
                  if (!num)
                      cnt -= base;
                  base *= 10;
              }
              return cnt;
          }
          int main()
          {
              std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
              ll l, r;
              cin >> l >> r;
              cout << f(r, 2) - f(l - 1, 2);
              return 0;
          }
          
          • 3
            @ 2022-10-17 21:43:40

            这道题太简单了!!!!

            还是2010年的题!!!

            ·······································································

            思路: 输入 l 和 r , for 循环从 l 到 r ,每次将 i 拆分成一个一个数字,拆一个判断 一下是否符合要求,是的话就num++,拆完之后sum+=num。最后输出 sum 就好了。

            ·······································································

            代码:

            for(int i=l;i<=r;i++)
            {
            	int num=0,j=i;   //这是很重要的,不加会陷入死循环
            	while(j>0)
                {
                  	  int t=j%10;   //拆各位
            	      if(t==2)
            	      	     num++;
            	      j/=10;       //去各位
            	}
            	sum+=num; 
            }
            cout<<sum;
            return 0;
            
            • 2
              @ 2023-10-13 21:23:45

              太简单了!!!直接上代码

              AC Code

              #include<bits/stdc++.h>
              using namespace std;
              int l, r, sum;
              int find(int x)
              {
                  int num = 0;
                  while(x > 0)
                  {
                      int y = x % 10;
                      x /= 10;
                      if (y == 2)
                      {
                          num++;
                      }
                  }
                  return num;
              }
              int main()
              {
                  cin >> l >> r;
                  for (int i = l; i <= r; i++)
                  {
                      sum += find(i);
                  }
                  cout << sum;
                  return 0;
              }
              
              • 2
                @ 2023-9-8 20:53:04
                #include<bits/stdc++.h>
                using namespace std;
                int main()
                {
                    int a, b, sum = 0, c;
                	cin >> a >> b;
                	for(int i = a; i <= b; i++)
                	{
                		c = i;
                    	while(c > 0)
                    	{
                        	if(c % 10 == 2)
                		    {
                                sum+=1;
                		    }
                        	c /= 10;
                    	}
                	}
                	cout << sum;
                    return 0;
                }
                

                A

                • 2
                  @ 2022-9-29 19:38:38

                  对于这题,我们应该枚举所有的数,然后依次对每位进行判断,如果发现2,就将答案+1。

                  #include <bits/stdc++.h> // 万能头文件
                  using namespace std;
                  int L, R, ans;
                  int main()
                  {
                      scanf("%d %d", &L, &R);
                      for (int i = L; i <= R; i++)
                      {
                          int w = i;
                          while (w > 0)
                          {
                              int now = w % 10; // 求各位
                              if (now == 2) // 如果这位为2,则答案+1
                                  ans++;
                              w /= 10;
                          }
                      }
                      printf("%d", ans);
                      return 0;
                  }
                  
                • 2
                  @ 2022-8-30 22:21:17

                  这应该是全国最简单的代码了吧······不废话了,直接上代码,解释看注释。

                  #include <bits/stdc++.h>

                  using namespace std;

                  int l,r,num,tmp;

                  int main()

                  {

                  cin>>l>>r;
                  
                  for(int i=l;i<=r;i++)
                  
                  {
                  
                      tmp=i;//这一步千万要写,否则会无限循环
                  
                      while(tmp>0)//每次都判断一遍
                  
                      {
                  
                          if(tmp%10==2)
                  
                              num++;//tmp%10是指tmp的个位,这里判断是不是2
                  
                          tmp/=10;//tmp除以10,下次判断个位时,就是新的数位了
                  
                      }
                  
                  }
                  
                  cout<<num;
                  
                  return 0;
                  

                  }

                  最后厚颜无耻地求一波赞~~~

                  • @ 2022-9-3 14:56:42

                    题解不要直接将所有代码拿出来,会有同学不自觉抄的,下一次写题解请尽可能的把自己的思路写出来

                  • @ 2023-6-4 20:31:50

                    @酢乙女爱 抄完想想就好了

                • 2
                  @ 2022-8-29 16:10:43

                  题目描述:

                  统计[L,R]的所有整数中,数字2出现的次数。 例如,22出现了2次2,12出现了1次2。

                  进入正题:

                  简单分析完题目,就是一个很简单的数位拆分问题,只不过我们要算一个范围内的每一个数。 那么我们用一个for循环去遍历L到R,之后在数位拆分不就好啦!

                  这里比较重要的数学知识是:

                  1、中括号括起来的范围是包含头和尾的。

                  2、取的是一个数的每一位。 需要用到%10,对10取余取每一位数,之后把这个数再次/10,除10去掉这一位。不断重复知道这个数不能在除了(这也是数位拆分的思想

                  开始我们的重要代码部分:

                  for(int i=L;i<=R;i++){
                  //这里就是遍历L到R中的每一个数
                  		tmp=i;
                  //此处解析看下文
                  //之后进行很典型的数位拆分
                  		while(tmp>0){
                  			if(tmp%10==2){
                  				num++;
                  			}
                  			tmp/=10;
                  		}
                  //这里我们把每一次算的数量放在sum中
                  //同时把num归零便于下一次计算。
                  		sum+=num;
                  		num=0;
                  	}
                  

                  tmp=i;

                  我们为什么会用到tmp这样的中间变量呢? 因为 i 代表的是每一次的变化的数,如果直接用 i 进行数位拆分,就破坏了我们想遍历L到R每一个数的想法,所以这里需要用一个其他变量来代表i进行取数。

                  数位拆分

                  2345这样的四位数如何取每一位的值呢?

                  步骤1~ 可以运用对10取余这样就可以取到个位。 2345%10=5;

                  步骤2~ 再次运用除10把个位数删掉。 2345/10=234;

                  重复以上步骤

                  对234再次对10取余

                  234%10=4;

                  234/10=23;

                  不断进行这样的操作 ....... .......

                  直到剩到 2/10=0的时候,结束while循环。

                  • 1
                    @ 2024-2-5 20:04:16

                    相似题型:[入门][NOIP2013 普及组] 计数问题

                    AC代码

                    #include <iostream> 
                    using namespace std;
                    int l,r,num;//l表示左端点,r表示右端点
                    int main()
                    {
                        cin>>l>>r;
                        //从l至r循环遍历
                        for(int i=l;i<=r;i++){
                            int y=i;
                            //统计2的数量
                            while(y>0){
                                if(y%10==2)
                                    num++;
                                y/=10;
                            }
                        }
                        cout<<num;
                        return 0;
                    }
                    
                    • 1

                    [入门][NOIP2010 普及组] 数字统计

                    信息

                    ID
                    1562
                    时间
                    1000ms
                    内存
                    256MiB
                    难度
                    2
                    标签
                    递交数
                    318
                    已通过
                    199
                    上传者