Con ngi thng x l nhng bi ton bng h m thp phn, nhng c l h m nh phn li l h m c a thch hn vi nhng chic my tnh. Trong PC ca bn, cc con s c th hin bng cc bit di dng nh phn (0,1). Khi chng ta nhp cc con s dui dng thp phn, my s x x l v a v h nh phn di dng cc bit m chng ta c th tm hiu l 0 v 1. V ch ti khi xut d liu ra (mn hnh hoc tp vn bn), cc s mi c th hin li dng thp phn. Mi tp trong my thc cht l dng cc byte, trong c nhng byte gi v tr c bit dng iu khin vic hin th. Mt s ngi c th hiu t nhiu v bit v cc bi ton x l bit, mt s ngi th khng. Nhng iu khng phi l quan trng, khi m iu quan trng l chng ta s cp n mt vn tng chng nh rt phc tp (i vi nhng ngi cha bit nhiu v n), nhng tht ra li tht l n gin m hiu qu li rt cao trong khi x l nhng bi ton hay v kh. Sau y l nhng thng tin s lc v bit trong PC. - Trong PC, mi s nguyn u c biu din h nh phn bi mt dy cc bit 0 v 1. - Cc bit c m s vi nhng s hiu t phi sang tri. 7 6 5 4 3 2 1 0 - 1byte=8bit - 1word=16bit - Hm sizeof (x) = s byte ca s nguyn x. - Cc php ton x l bit: + NOT x : php o bit, i cc gi tr trong mi bit ca x t 0->1,1->0. + x OR y : Php cng logic trn cc bit.Thc hin trn tng cp bit tng ng ca cc ton hng theo bng sau.
+ x AND y : Php nhn logic trn cc bit. Thc hin trn tng cp bit tng ng ca cc ton hng theo bng sau.
+ x XOR y : Php cng logic trn cc bit.Thc hin trn tng cp bit tng ng ca cc ton hng theo bng sau.
+ x SHR i : Php dch phi, cho gi tr c c t s nguyn x sau khi dch sang phi i bit. + x SHL i : Php dch tri, cho gi tr c c t s nguyn x sau khi dch sang tri i bit. Trn y l mt s php ton lm vic trn cc bit m ta hay dng, trn c s , ta xy dng c mt s hm, th tc hay dng sau. - Hm ly bit. Function LayBit(x:word; i:byte):byte; Begin LayBit:=(x SHR i) and 1 End; Hm tr v gi tr l bit th i ca s nguyn x. - Th tc bt bit. Procedure BatBit(Var x:word; i:byte); Begin X:=x OR (1 SHL i) End; Th tc gn tr 1 cho bit th i trong s nguyn x. - Th tc tt bit. Procedure TatBit(Var x:word; i:byte); Begin X:=x AND (NOT(1 SHL i)) End; Th tc gn tr 0 cho bit th i trong s nguyn x. - Hm Ly s. Function LaySo(x:word;j,i:byte):byte; Var K:byte; Begin K:= (8*sizeof(x) - j - 1); LaySo := (x SHL k) SHR (i+k) End; Hm tr v gi tr l s to bi cc bit t tri sang phi, t j -> i ca s x vi iu kin 8*sizeof(x)> j i 0. Tip n, chng ta s gii quyt mt s bi ton kh hay v x l bit. Bi ton: Sp xp dy. Cho tp Data.dat gm cc s nguyn khng m nh hn 500 000 i mt khc nhau. Hy xp tp theo th t tng dn v a ra tp Result.dat. Bi ton trn khin ta cm thy kh chu v gii hn d liu ca n, nu ta ngh n vic dng mng lu tr v xp xp thun tu th qu l ng ngn bi v b nh 64K chng thm thp vo u v ring vic xp xp chim mc thi gian k lc ri. Ta cng c th dng phng php xp xp ngoi Merge Sort (dng file sp xp), tuy nhin, y khng phi l gii php hu hiu v vn thi gian. Tuy nhin, phng php sp xp nh du bng mt vi th thut dng bit th s li cho ta mt kt qu kh l m mn. Ta ch cn dng mt mng A kiu byte vi khong 63000 phn t l tha x l bi ton ny. Ta tng tng mng A l mt on tu, v mi toa tu l mt phn t c 8 ch ngi, ch ngi c nh du l 1 nu c ngi ngi, l 0 nu ngc li. Ban u on tu khng c ngi ngi, ta gn mng bng 0. V vi mi phn t c t file ra, ta nh du bit tng ng trong mng cho ti khi ht file bng th tc batbit. ly kt qu ghi ra file, ta dng function laybit. Sau y l chng trnh th hin thut ton: {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+} PROGRAM XAP_XEP_DAY_VOI_DU_LIEU_LON; Const Datin = 'Data.dat'; Datout = 'Result.dat'; Bt=8; MAX=63000; Var a:array[0..MAX] of byte; f:text; Procedure Finish; Var i,j:longint; Function LayBit(x,j:longint):byte; Begin LayBit:=(x shr j) and 1; End; Begin Assign(f,DATOUT);rewrite(f); For i:=0 to max do For j:=0 to bt-1 do If LayBit(a[i],j)=1 then Write(f,(i*bt+j),' '); Close(f) End; Procedure Start; Var i,tg:longint; Procedure BatBit(x,y:longint); Begin A[x]:=a[x] or (1 shl y) End; Begin Fillchar(a, sizeof (a), 0); Assign(f,DATIN);reset(f); While not seekeof(f) do Begin Read(f,tg); BatBit(tg div bt,tg mod bt) End; Close(f) End; BEGIN Start; Finish END. Mt s bi tp tng t. Bi s 1: Trn tp. Cho 2 tp In1.dat v In2.dat cha cc s nguyn khng m c th rt ln (khng ln hn 500 000). Hy to tp Out.dat cha cc s c mt trong 2 tp trn, tuy nhin, khng c trng nhau. Bi s 2: Ta xu. Cho file vn bn Str.inp gm nhiu dng, mi dng khng qu 30 k t, ch cha hai k t * v . Hy loi b bt cc dng ging nhau ri in kt qu ra file Str.out gm cc dng khc nhau. Bi s 3: M s nhn vin Tng gim c mt cng ty X ni ting l ngi k lng. ng ta thc hin vic qun l nhn vin ca mnh bng cch gn cho mi nhn vin mt m s. Cng ty c N nhn vin th mi nhn vin i (i=1, 2,,N) c mt m s. M s l mt s nguyn dng (hai nhn vin khc nhau phi c m s khc nhau). Do bn i cng tc mt thi gian di nc ngoi nn ng ta giao li quyn qun l cho mt ngi khc. Khi ng tr v, cng ty c thay i s lng nhn vin, khi tip nhn thm nhn vin mi, ng ta yu cu mun bit m s nh nht c th gn cho nhn vin mi. Yu cu: Cho N m s ca cc nhn vin trong cng ty. Hy tm m s nh nht cha xut hin trong N m s cho. D liu vo t tp vn bn CODE.INP + Dng u l s N (1<N<=30.000) + N dng tip theo, dng th i ghi s ai (i=1..N, 1<=ai<=10 9 ) Kt qu ghi ra tp vn bn CODE.OUT mt s duy nht l m s tm c V d ( Hnh bn)
CODE.INP CODE.OUT 7 6 5 9 1 3 4 2 Mi s t nhin u c th biu din c di dng nh phn. i vi my tnh, cc gi tr s c lu bi cc bin di dng chui nh phn c di tng ng vi kiu bin . Trong ngn ng Pascal, mt s kiu ph bin nh: byte : di 8 BIT integer : di 2*8 = 16 BIT longint : di 4*8 = 32 BIT Cc BIT ca bin c nh s t phi sang tri bt u t 1. u im ca x l BIT: 1/ B nh: X l BIT c th c dng lm mng nh du. Thay v s dng 1 bin Boolean ch nh du c 1 phn t l True hay False, ta c th x l BIT nh du 8 BIT tng ng vi 8 phn t. 2/ Tc : Cc php x l BIT c tc nhanh hn cc php x l khc. V d: Hai php (x div 2) v (x shr 1) l nh nhau nhng php (x shr 1) c tc nhanh hn. Trong cc bi ton i hi vic thay i trng thi nhiu ln th ngi ta vn hay dng x l BIT ci thin tc chng trnh. Sau y l mt s php x l BIT c bn: 1/ Cng BIT (or): Kt qu bng tng gi tr 2 BIT. Trng hp 2 BIT u c gi tr bng 1 th kt qu l 1. V d: x1 = 9 (00001001) x2 = 18 (00010010) x1 or x2 = 27 (00011011) 2/ o BIT (not): o BIT 0 thnh BIT 1 v BIT 1 thnh BIT 0. V d: x1 = 13 (00001101) not (x1) = 242 (11110010) 3/ Nhn BIT (and): Kt qu bng tch gi tr 2 BIT. V d: x1 = 9 (00001001) x2 = 12 (00001100) x1 and x2 = 8 (00001000) 4/ Loi tr BIT (xor): Kt qu l 0 nu 2 BIT c cng gi tr, l 1 nu 2 BIT khc gi tr. V d: x1 = 9 (00001001) x2 = 18 (00010010) x1 xor x2 = 27 (00011011) 5/ Dch sang tri k BIT (shl): V d: x = 27 (00001101) x shl 2 = 108 (01101100) 6/ Dch sang phi k BIT (shr): V d: x = 27 (00001101) x shr 2 = 6 (00000110) T cc php ton trn, ta c cc cng thc m rng sau: 7/ Ly gi tr BIT: Cho bit BIT th k ca s x c gi tr bao nhiu: Function GetBIT(k , x : LongInt) : LongInt; begin GetBIT := (x shr (k-1)) and 1; end; 8/ Gn gi tr BIT: Gn gi tr c cho BIT th k ca s x:
Procedure SetBIT(c , k : LongInt; var x : LongInt); begin if c = 1 then x := x or (1 shl (k-1)) else x := x and (not (1 shl (k-1))); end; X l s nguyn ln Posted by basicalgorithm on December 6, 2009 X l s nguyn ln l mt k nng khng th thiu ca mt th sinh tham gia k thi HSGQG. Bi ton thng lin quan ti vic cng/tr/nhn vi cc s nguyn c nhiu (khong vi trm, vi nghn) ch s. Bi vit ny xin c cung cp cho cc bn cch thc hin cc php ton vi s nguyn ln. 1/ tng: Chng ta s thc hin cc php ton ny nh cch lm m hi cp 1 c hc. l thc hin cc php ton ln lt t phi qua tri v s dng thm mt bin nh. 2/ Khai bo: Cc php ton s c thc hin trn mng, do ta cn xy dng mng 1 chiu c kch thc l s ch s ti a ca bi ton. Mi phn t ca mng s l 1 ch s. Ngoi ra, cn khai bo bin base l h c s m chng ta dng khi thc hin cc php ton. Trong v d ny, ti t base = 10 tha mn mi phn t ch cha 1 ch s. Const maxn = 100; // S ch s ti a base = 10; // H c s khi s dng Type BigNum = array[0..maxn] of LongInt; // Kiu s nguyn ln 3/ Php cng: Function Plus(x , y : BigNum) : BigNum; // Kt qu l s nguyn ln var i , nho : LongInt; begin Fillchar(Plus , SizeOf(Plus) , 0); // Khi gn Plus = 0 nho := 0; // Khi gn nho = 0 For i := maxn downto 1 do // Cng ln lt tng ch s t phi qua tri begin Plus[i] := x[i] + y[i] + nho; // Cng thc cng nh cp 1 nho := Plus[i] div base; // Tnh li bin nho cho ln cng tip theo Plus[i] := Plus[i] mod base; // m bo mi phn t ch lu mt ch s end; end; phc tp: O(N) 4/ Php tr: Mt iu ng lu khi thc hin php tr l bin nh ch nhn 1 trong 2 gi tr: 0 hoc 1. Ngoi ra, m bo kt qu ng, bn cn ch khi ly X Y th X >= Y (c th vit 1 hm kim tra trc khi thc hin php tr). Function Minus(x , y : BigNum) : BigNum; var i , nho : LongInt; begin Fillchar(Minus , SizeOf(Minus) , 0); // Khi gn Minus = 0 nho := 0; For i := maxn downto 1 do begin Minus[i] := x[i] + base y[i] nho; // Cng thm base m bo Minus[i] >= 0 if x[i] < y[i] + nho then nho := 1 else nho := 0; // Tnh li bin nho Minus[i] := Minus[i] mod base; // m bo mi phn t ch cha 1 ch s end; end; phc tp: O(N) 5/ Php nhn: Chng ta vn thc hin cch lm nh cp 1: Ly tng ch s ca tha s th hai nhn vi tha s th nht, c bao nhiu cng vo kt qu. Ch sau mi ln nhn 1 ch s ca tha s th hai vi tha s th nht, ta cn li kt qu sang tri 1 ch s. Ngoi ra, s ch s ti a ca kt qu s l tng s ch s ca 2 tha s. V th, ta cn m bo ln cho kt qu trnh bRangeCheck. Tt nht bn hy khai bo maxn ln bng 2 ln di ti a ca 2 tha s. Function Multi(x , y : BigNum) : BigNum; var i , j , nho : LongInt; Temp : BigNum; begin Fillchar(Multi , SizeOf(Multi) , 0); // Khi gn Multi = 0 nho := 0; count := -1; // S ch s phi li vo trc khi nhn l -1 For i := maxn downto 1 do begin Inc(count); // Tng s lng ch s cn li vo lt nhn th i Fillchar(Temp , SizeOf(Temp) , 0); // Mng nhn ch s th i ca y vi x For j := maxn downto (maxn div 2 + 2) do begin Temp[j-count] := y[i]*x[j] + nho; nho := Temp[j-count] div base; Temp[j-count] := Temp[j-count] mod base; end; Minus := Plus(Minus , Temp); end; end; phc tp: O(N^2) 6/ Ci tin: Khi thc hin php cng/tr, ta nhn thy mi phn t ca kt qu thuc kiu LongInt, c th lu c 9 ch s. Do , ta c th tbase = 10^9 nhm gim i s lng php tnh. S lng phn t ti a ca mng BigNum cng gim i ~9 ln. Tuy nhin, khi in ra, do mi phn t lu 9 ch s nn ta cn in ra c 9 ch s ny (tnh c cc ch s 0 v ngha u). Procedure Print; var i , j : LongInt; s : string; begin For i := 1 to maxn do if Res[i] <> 0 then break; // Tm phn t khc 0 u tin ca kt qu write(Res[i]); For j := i + 1 to maxn do begin str(Res[j] , s); // Chuyn Res[j] sang xu s while length(s) < 9 do s := 0 + s; // Thm cc ch s 0 vo u m bo 9 ch s write(s); end; end;