8 solutions

  • 5
    @ 2024-12-13 19:55:37
    //某神金的方法(注释某金蝉加的)
    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	int ppp,max=1,sum=0;
    	cin>>ppp;
    	while(ppp>max){
    		max*=2;
    		sum++;//计算k在2进制中的位数
    	}
      while(ppp){
    		if(ppp%2==0)sum--;//低位如果有0的话,就要减掉
    		else break;
    		ppp/=2;
    	}cout<<max<<" "<<sum;
    	return 0;
    }
    
    
    //某金蝉的方法
    #include<iostream>
    using namespace std;
    int main(){
    	int k,a=1,sum=0;
    	cin>>k;
    	while(a<k)a*=2;//巧克力最小值一定要比顾客的巧克力大,又要是2的非负整数次方 
    	cout<<a<<" ";
    	int u=a/2;
    	while(a!=k){
    		if(a>k)a-=u;//巧克力太大就剪切 
    		if(a<k)a+=u;//巧克力太小就添加 
    		sum++;//计算剪切次数 
    		u/=2;//每剪切或添加一次,下次需要添加或剪切的巧克力就要除以2,不然会死循环 
    	}
    	cout<<sum;
    	return 0;//帅气结束 
    }
    //PS:两种方法原理一样,但第二种方法更为易懂
    
    • 5
      @ 2023-11-20 21:04:56
      #include<bits/stdc++.h>
      using namespace std;
      int n;
      int m(int x){//一个函数寻找2的妈(幂) 
      	int y=1;
      	while(y<x) y*=2;
      	return y;
      }
      int main(){
      	cin>>n;
      	int t=m(n),ans=t;//用t来存m以免多次计算m,ans记录t因为后面t会变 
      	int s=0,sum=0;//s:目前巧克力总数;sum:总刀数 
      	if(t==n){
      		cout<<n<<' ';
      		cout<<0<<endl;//若不用切直接输出 
      		return 0;
      	}
      	int k=n;
      	while(s!=n){
      		if(t<=k){//注意不是每一个t都取 
      			s+=t;	
      			k-=t;
      		}
      		sum++;
      		t/=2;//除以2继续循环 
      	}
      	cout<<ans<<" "<<sum-1<<endl;//sum会多一,减掉 
      	return 0;//无需多言 
      }
      
      • @ 2023-11-29 16:40:23
        #include<iostream>
        using namespace std;
        int main(){
        	int k;
        	cin
        	>>k;
        	int d=1;
        	while(d<k)
        	d*=2;
        	cout<<d<<" ";
        	if(d==k){
        		cout<<0;
        		return 0;
        	}
        	int sum=0;
        	while(k-d){
        		if(d<=k)
        		k-=d;
        		sum++;
        		d/=2;
        	}
        	cout<<sum--;
        }
        
      • @ 2023-11-29 16:40:40

        @

        大佬代码的优化版

    • 3
      @ 2024-4-26 13:54:47
      #include<iostream>
      using namespace std;
      int main()
      {
      	int n,c,i=0;
      	cin>>n;//输入
      	c=n&-n;//取最小的巧克力
      	for(;c<n;c<<=1)//位移
      	{
      		i++;//计次数
      	}
      	cout<<c<<" "<<i;//输出
      	return 0;//完结散花
      }
      
      • 2
        @ 2024-12-13 19:16:01

        超短代码

        # include<bits/stdc++.h>
        using namespace std;
        int main(){
        	int ppp,max=1,sum=0;
        	cin>>ppp;
        	while(ppp>max){
        		max*=2;
        		sum++;
        	}while(ppp){
        		if(ppp%2==0)sum--;
        		else break;
        		ppp/=2;
        	}cout<<max<<" "<<sum;
        	return 0;
        }
        
        • 1
          @ 2023-11-4 16:48:54
          using namespace std;
          void Cokolada(int K){
          	int n2=K,m=0,sum=0,times=0;;
          	for(int i=0;i<K;i++){//寻找最近的2的整数幂 
          		if(K==pow(2,i)){
          			cout<<K<<" "<<0;//如果K本身是2的整数幂则输出本身,需要切0次,返回 
          			return;
          		}
          		if(pow(2,i)>K){
          			cout<<int(pow(2,i))<<" ";//否则输出最小的大于K的2的整数幂 
          			m=i-1;//这里设成i-1是因为2^i-1是最大的不大于K的2的整数幂 
          			break;//跳出循环以免出bug 
          		}
          	}
          	
          	while(sum!=K){//不断切分直到切出K个单位为止 
          		if(pow(2,m)<=n2){//寻找最大的不大于n2的2的整数幂,之所以需要n2是因为K要作为定值 
          			sum+=pow(2,m);//说明已经存在sum个单位的蛋糕 
          			n2-=pow(2,m);//还需要n2个单位的蛋糕 
          		}
          		times++;//切的次数+1 
          		m-=1;//下一刀分出来的块数是原来的二分之一 
          	}
          	cout<<times;//输出 
          	return;
          }
          int main() {
          	int K;
          	cin>>K;
          	Cokolada(K);
              return 0;
          }
          
          
          • 0
            @ 2024-1-6 13:01:02
            #include<iostream>
            using namespace std;
            int main()
            {
            	int n,c,i=0;
            	cin>>n;//输入
            	c=n&-n;//取最小的巧克力
            	for(;c<n;c<<=1)//位移
            	{
            		i++;//计次数
            	}
            	cout<<c<<" "<<i;//输出
            	return 0;//完结散花
            }
            
            • -1
              @ 2023-12-15 13:28:52

              #include<bits/stdc++.h> using namespace std; int main(){ int a,b=0,c=0; cin>>a; for(int i=1;i<=10000000;i*=2){ if(i>=a){ c=i; break; } } for(int j=c;j>=1;j/=2){ if(a%j!=0){ b++; } else{ cout<<c<<" "<<b; break; } } }

              • -3
                @ 2023-11-29 16:41:04
                #include<iostream>
                using namespace std;
                int main(){
                	int k;
                	cin
                	>>k;
                	int d=1;
                	while(d<k)
                	d*=2;
                	cout<<d<<" ";
                	if(d==k){
                		cout<<0;
                		return 0;
                	}
                	int sum=0;
                	while(k-d){
                		if(d<=k)
                		k-=d;
                		sum++;
                		d/=2;
                	}
                	cout<<sum--;
                }
                
                
                • 1

                Information

                ID
                908
                Time
                1000ms
                Memory
                32MiB
                Difficulty
                7
                Tags
                # Submissions
                154
                Accepted
                36
                Uploaded By