ビット操作と再帰魔法(Luogu P1010感じ)

Luogu P1010を作り、大きな男の考えにショックを受け、自分の考えについて話しました。

ビット演算記号
右シフト:x >> ixがオペランド、iがシフト番号
同様に、左シフト:x << i。
また、ビットごとのANDも一般的に使用され、さまざまな状況の判断によく使用されます。
たとえば

     1的二进制表示为0000 0001 
                 x=0000 0011;
            	y=0000 0010;
	                 a=x&1;   //1的二进制与x的二进制按位与得到a=1; 
                 	b=y&1;     //1的二进制与y的二进制按位与得到b=0;

ビット演算は、数値演算の直接形式であり、通常の数値演算よりも1グレード以上高速です。問題によっては、時間とスペースの消費を削減できるだけでなく、ショートカットを開いてアルゴリズム構造を最適化することもできます。

ビット操作の
理解一般的な理解は、通常の数値をバイナリデータの文字列として想像することです。

     0000 0111  //7的二进制表示0000 0111进行右移一位 
	 0000 0011  // 移位后变成3的二进制 

右シフトは、整数データを2のn乗で除算したものに相当し
ます
x =?; x = x / 2; x = x >> 1と同等です;
このビットごとの演算と再帰を付加して、理解を深めますLuoguタイトル:
リンク:https
: //www.luogu.com.cn/problem/P1010
任意の正の整数は、22の累乗で表すことができます。たとえば、137 = 2 7 + 2 3 + 2 ^ 0137 = 2
7
+2
3
+2
0
です。

同時に、合意された順序は角括弧で示されます。つまり、a ^ ba
b
はa(b)a(b)として表すことができます。

137137は2(7)+2(3)+2(0)2(7)+2(3)+2(0)として表すことができることがわかります。

さらに:

7 = 2 2 + 2 + 2 07 = 2
2
+ 2 + 2
0
(2 ^ 12
1
は22で表されます)、および3 = 2 + 2 ^ 03 = 2 + 2
0
です。

つまり、137137は2(2(2)+ 2 + 2(0))+ 2(2 + 2(0))+ 2(0)2(2(2)+ 2 + 2(0))+として表すことができます。 2(2 + 2(0))+ 2(0)。

別の例は1315 = 2 ^ {10} + 2 ^ 8 + 2 ^ 5 + 2 + 11315 = 2
10
+2
8
+2
5
+ 2 + 1

したがって、13131315は2(2(2 + 2(0))+ 2)+2(2(2 + 2(0)))+ 2(2(2)+2(0))+ 2 + 2として表すことができます(0)2(2(2 + 2(0))+ 2)+2(2(2 + 2(0)))+ 2(2(2)+2(0))+ 2 + 2(0) 。

入力形式
1行に1つの正の整数nn。

出力形式
は、合意されたnn 0、20、2 表現に準拠します(表現にスペースはありません)。

サンプルの入力と出力
入力#1コピー
1315
出力#1コピー
2(2(2 + 2(0))+ 2)+2(2(2 + 2(0)))+ 2(2(2)+2( 0))+ 2 + 2(0)
ACコード:

#include<bits/stdc++.h>
using namespace std;

#define ull   unsigned long long

string f(int x,int i=0,string s="")
{
	if(x==0) return "0";
	do 
	{
		if(x&1)
		{
			s=(i==1?"2":"2("+f(i)+")")+(s==""?"":"+")+s;  递归核心
		}
		i++;
	}while(x>>=1);
	return s;
}
int  main(){
	ios::sync_with_stdio(false);
	cout.tie(NULL);
    int n;
    cin>>n;
    cout<<f(n)<<endl;
	return 0;
}
    
オリジナルの記事を6件公開 いいね1 訪問数141

おすすめ

転載: blog.csdn.net/qq_46015269/article/details/105588091