9 条题解

  • 20
    @ 2022-8-30 21:02:04

    最近学业有点忙碌,UP好久没做题,手都生了,来看看今天的这一道题吧~

    1. 首先我们用一个函数 two 来做是 A类还是 B类的判断
    2. 然后一次把 n 取余2,把每次取余的值存储到数组 a 中,这个就是 n 的二进制数啦~
    3. 然后再用 s 来计算 a 的长度,并且便利 a 数组,用 sum1 来计算 1 的数量,用 sum2 来计算 0 的数量
    4. 最后做一个判断,如果 1 多的话返回 true 否则返回 false 就可以啦~

    最近发现好多人都开始抄我的格式,请不要抄袭谢谢(针对头顶上这位)

    最后上代码吧~(UP已经AC过啦~)

    #include <bits/stdc++.h>
    using namespace std;
    bool two(int n)
    {
        int s = 0, num1 = 0, num2 = 0, a[100] = {};
        while (n > 0)
        {
            a[s] = n % 2;
            s++;
            n /= 2;
        }
        for (int i = s; i >= 0; i--)
        {
            if (a[i] != 1) a[i]--;
            else break;
        }
        for (int i = 0; i <= s; i++)
        {
            if (a[i] == 1) num1 += 1;
            if (a[i] == 0) num2 += 1;
        }
        if (num1 > num2) return true;
        else return false;
    }
    int main()
    {
        int n;
        cin >> n;
        int num1 = 0, num2 = 0;
        for (int i = 1; i <= n; i++)
        {
            if (two(i)) num1 += 1;
            else num2 += 1;
        }
        cout << num1 << " " << num2;
        return 0;
    }
    
    • @ 2023-8-19 21:03:54

      大佬( ̄︶ ̄*))

    • @ 2024-2-28 16:05:27
      #include<iostream>
      using namespace std;
      int n,na=0,nb=0;int main(){cin>>n;for(int i=1;i<=n;i++){int a[10005],k=1;int t=i;while(t!=1){a[k++]=t%2;t/=2;}a[k]=1;int n1=0,n0=0;for(int i=1;i<=k;i++){if(a[i]==1){n1++;}else{n0++;}}if(n1>n0){na++;}else{nb++;}}cout<<na<<" "<<nb<<endl;}
      
    • @ 2024-3-24 20:11:36

      《还 是 p v p 大 佬》

  • 12
    @ 2022-8-23 14:45:54

    思路(已AC):

    定义b:一个数的“0”个数
    c: 一个数的“1”个数
    t(): 判断1和0谁多
    q:所有数的“1”个数
    w: 所有数的“0”个数
    
    #include <iostream>
    using namespace std;
    
    int t(int a) //判断
    {
        int b = 0,c = 0;
        while (a >= 1) //转二进制
        {
            if (a % 2 == 1)
            {
                ++b;
            }
            else
            {
                ++c;
            }
            a = a / 2; 
        }
    
        if (b > c) // 如果这个二进制数0比1多
        {
            return 1; //报告b > c
        }
        else
        {
            return 2; //b <= c
        }
    }
    
    int main()
    {
        int s,q = 0,w = 0;
        cin >> s;
        for (int i = 1;i <= s;i++)
        {
            if (t(i) == 1)//b > c的话
            {
                ++q;
            }
            else
            {
                ++w;
            }
        }
        cout << q << " " << w;
        return 0;
    }
    

    记得点赞呀!做出第一个题解

    • @ 2022-8-27 12:16:47

      我的代码应该算对吧(真的是自己写的)

      #include <bits/stdc++.h>
      using namespace std;
      char panduan(int x)
      {
          long long a = 0, b = 0;
          while (x > 0)
          {
              if (x % 2 == 1)
              {
                  a++;
              }
              else
              {
                  b++;
              }
              x /= 2;
          }
          if (a > b)
          {
              return 'a';
          }
          else
          {
              return 'b';
          }
      }
      int main()
      {
          int n;
          cin >> n;
          long long v = 0, m = 0;
          for (int i = 1; i <= n; i++)
          {
              if (panduan(i) == 'a')
              {
                  v++;
              }
              else
              {
                  m++;
              }
          }
          cout << v << " " << m;
          return 0;
      }
      
    • @ 2023-12-19 20:44:26
      #include<iostream>
      using namespace std; 
      int l,c=0,x=0;
      int b=0,a[9999];
      int main(){
      	cin>>l;
      	for(int i=1;i<=l;i++){
      		b=0;
      		int n=i;
      		while(n>0){
      			b++;
      			a[b]=n%2;
      			n/=2;	
      		}
      		int g=0,h=0;
      		for(int j=b;j>=1;j--){
      			if(a[j]==0){
      				g++;
      			}
      			else{
      				h++;
      			}
      		}
      		if(h>g){
      			c++;
      		}
      		else{
      			x++;
      		}
      	}
      	cout<<c<<' '<<x;
      	
      	return 0;
      }
      

      不会写函数的看过来👀️ 👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️👀️

    • @ 2024-5-4 21:39:37

      我TLE了

  • 7
    @ 2022-9-12 9:40:17

    全网最短代码来了

    #include <bits/stdc++.h>
    using namespace std;
    bool panduan(int x)
    {
        long long a = 0, b = 0;
        while (x > 0)
        {
            if (x % 2 == 1) a++;
            else b++;
            x /= 2;
        }
        if (a > b) return 1;
        else return 0;
    }
    int main()
    {
        int n;
        cin >> n;
        long long v = 0, m = 0;
        for (int i = 1; i <= n; i++)
        {
            if (panduan(i)) v++;
            else m++;
        }
        cout << v << " " << m;
        return 0;
    }
    
    • @ 2023-8-19 21:16:13

      [动画表情]

    • @ 2024-2-28 16:34:21

      我的才是全网最短代码:

      #include<iostream>
      using namespace std;int main(){int n,na=0,nb=0;cin>>n;for(int i=1;i<=n;i++){int a[10005],k=1;int t=i;while(t!=1){a[k++]=t%2;t/=2;}a[k]=1;int n1=0,n0=0;for(int i=1;i<=k;i++){if(a[i]==1){n1++;}else{n0++;}}if(n1>n0){na++;}else{nb++;}}cout<<na<<" "<<nb;}
      
    • @ 2024-2-28 16:41:15

      或者是这种:

      #include<iostream>
      using namespace std;int main(){long long a,b=0,c=0,d=0,e=0;cin >> a;for (long long i=1;i<=a;i++){for (long long j=i;j!=0;j/=2){if (j%2==1){b++;}else{c++;}}if (b>c){d++;}else{e++;}b=0;c=0;}cout<<d<<' '<<e;}
      
    • @ 2024-2-28 16:47:25

      如果简化一下你的代码应该是这样的:

      #include<iostream>
      using namespace std;bool panduan(int x){long long a=0,b=0;while(x>0){if(x%2==1){a++;}else{b++;}x/=2;}if(a>b){return 1;}else{return 0;}}int main(){int n;cin>>n;long long v=0,m=0;for(int i=1;i<=n;i++){if(panduan(i)){v++;}else{m++;}}cout<<v<<' '<<m;}
      
  • 5
    @ 2023-8-15 16:09:40
    输入n,从1到n循环依次判断
    
    定义一个数组a存储转换成二进制后的0和1,定义k存储0和1的总个数
    
    重复计算这个数对2取模,存到a中,再将这个数除以2,也就是转换成二进制
    
    计算到最后数变成1,退出循环并将1也存进a
    
    然后就得到了转换成二进制的数,遍历一遍判断1多还是0多,就能知道是A类还是B类
    
    统计A类和B类的个数,输出
    
    代码(AC):
    #include<iostream>
    using namespace std;
    int n,na=0,nb=0;
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		int a[10005],k=1;
    		int t=i;
    		while(t!=1){
    			a[k++]=t%2;
    			t/=2;
    		}
    		a[k]=1;
    		int n1=0,n0=0;
    		for(int i=1;i<=k;i++){
    			if(a[i]==1) n1++;
    			else n0++;
    		}
    		if(n1>n0) na++;
    		else nb++;
    	}
    	cout<<na<<" "<<nb<<endl;
    	return 0;
    }
    
    • 5
      @ 2023-8-10 20:21:49
      #include <iostream>
      using namespace std;
      int t(int a) 
      {
          int b = 0,c = 0;
          while (a >= 1)
          {
              if (a % 2 == 1)
              {
                  ++b;
              }
              else
              {
                  ++c;
              }
              a = a / 2; 
          }
          if (b > c)
          {
              return 1;
          }
          else
          {
              return 2;
          }
      }
      
      int main()
      {
          int s,q = 0,w = 0;
          cin >> s;
          for (int i = 1;i <= s;i++)
          {
              if (t(i) == 1)
              {
                  ++q;
              }
              else
              {
                  ++w;
              }
          }
          cout << q << " " << w;
          return 0;
      }
      
      • 4
        @ 2022-5-27 14:32:59

        题解:先把一个数字转化成二进制,然后统计二级制中1和0的个数,如果1的个数多余0就是A类,反之就是B类。最后统计A类的个数和B类的个数。

        二进制转化的代码:

        int a[5]={};
        int i=0;
        	while(num>=1){
        		a[i]=num%2;
        		i+=1;
        		num/=2;
        	}
        

        然后是统计1与0的个数之前有一个坑点: 比如1的二进制是0001,题目要求1的二进制是:1,前面0省略,算的是A类,而非B类, 在举例:2的二进制是0010,题目2的二进制是10,前面的0省略。

        所以需要先删除1前面无效的0。

        while(a[i]!=1){
             i--;
        }
        

        接下里就可以统计1与0的个数,1的个数多就是A类,反之B类。

        int x=0,y=0;		//x代表1的个数,y代表0的个数。	
        	for(;i>=0;i--){		//遍历二进制判断,1多余0是A类,1的数量<=0的数量是B类。
        		if(a[i]==1){
        			x++;		
        		}else{
        			y++;
        		}
        	}
        

        如果X多于y,返回true,就是A类,false是b类。

        if(x>y){		
        		return true;
        	}else{
        		return false;
        	}
        

        最后省略了1-n之间,统计a类b类的过程。

        • 3
          @ 2024-1-10 23:16:16

          AC代码(本人没学过函数),谢谢!

          #include <bits/stdc++.h>
          using namespace std;
          int main()
          {
              long long a,b=0,c=0,d=0,e=0;
              cin >> a;//输入
              for (long long i=1;i<=a;i++)//遍历1----a
              {
                  for (long long j=i;j!=0;j/=2)//不断除以2,直到j==0
                  {
                      if (j%2==1)//判断此位是1还是0
                      {
                          b++;//统计1
                      }
                      else
                      {
                          c++;//统计0
                      }
                  }
                  if (b>c)//判断是A类还是B类
                  {
                       d++;//统计A类
                  }
                  else
                  {
                      e++;//统计B类
                  }
                  b=0;
                  c=0;
                  //恢复出厂设置(don't)
              }
              cout << d << ' ' << e;//输出
              return 0;
          }
          
          • 1
            @ 2024-5-15 20:59:32

            全网最短 第二短 第三短的代码来了~

            #include <bits/stdc++.h> 
            using namespace std;
            bool check(int q)
            {
                int g0=0,g1=0;
                while(q>0){if(q%2==0) g0++;else g1++;q=q/2;}
                if(g1>g0) return true;
                return false;
            }
            int main()
            {
                int n;
                cin >> n;
                int numA=0,numB=0;
                for(int i=1;i<=n;i++)
                {
                    if(check(i)) numA++;
                    else numB++;
                }
                cout<<numA<<" "<<numB;
                return 0;
            }
            
            
            • 1
              @ 2024-4-30 20:12:57

              AC代码,放心食用

              累死我了


              #include <bits/stdc++.h> 
              using namespace std;
              int a,b;
              string erjinzhi(int n)//自定义返回字符串的二进制函数
              {
                  string r;
                  while (n != 0)//不知道多少次用个while
                  {
                      r += (n % 2 == 0 ? "0" : "1");
                      n /= 2;
                  }
                  return r;//返回转化完的的二进制字符串
              }
              int main()//美丽的主函数
              {
                  int n;
                  string s;
                  cin >> n;//输入n
                  for(int i = 1;i<=n;i++)
                  {
                      int s1=0,s2=0;//每次都要刷新就放循环里了
                      s = erjinzhi(i);//调用二进制函数
                      for(int j = 0;j<int(s.length());j++)
                      {
                          if (s[j] == '1') s1++;//"1"有多少个
                          else s2++;//"0"有多少个
                      }
                      if(s1>s2) a++;//"1"多,A类
                      else b++;//"0"多,B类
                  }
                  cout << a <<" "<< b;//输出
                  return 0;//结束
              }
              

              制作不易,点个赞吧

              • 1

              信息

              ID
              141
              时间
              1000ms
              内存
              16MiB
              难度
              6
              标签
              递交数
              1054
              已通过
              585
              上传者