反過來想 一開始先從最大步的開始走 然後每次/2
就發現 如果現在的數是正的 代表這一步一定是向右走的
(因為就算全部都往左最後往右還是正的) 反之
所以就扣掉(或加回來) 然後繼續走 直到回原點
然後記得反過來輸出就好
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include<bits/stdc++.h> using namespace std; #define ll long long string ans; ll d,mxi; void walk(){ if(d>0){ ans='+'+ans; d-=mxi; } else{ ans='-'+ans; d+=mxi; } mxi>>=1; } int main(){ cin>>d; { mxi=1; for(;mxi<=d;mxi<<=1){} mxi>>=1; } while(d){ walk(); } cout<<ans.length()<<'\n'<<ans<<'\n'; } |
沒有留言:
張貼留言