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;
}