You are on page 1of 20

Kim tra 1 s nguyn t

+ nh ngha: L s nguyn ln hn 1, ch c 2 c l 1 v chnh n. Cc s nguyn t t 1100: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 + Thut ton: kim tra 1 s nguyn n c phi s nguyn t hay khng, ta lm theo cc bc. - Nu n<2 th khng phi s nguyn t. - Kim tra trong on t 2..sqrt(n) xem c c ca n khng, nu c tn ti th n khng phi s nguyn t - Ngc li, n l s nguyn t. + Code: Visual C# Code: public bool isPrimeNumber(int n) { if (n < 2) return false; int temp = (int)Math.Sqrt(n); for (int i = 2; i <= temp; i++) { if (n % i == 0) return false; } return true; }

C++ Code: bool isPrimeNumber(int n) { if (n<2) return false; int temp=(int)sqrt(n); for (int i=2;i<=temp;i++) if (n%i==0) return false; return true; } __________________

Phng php sng Eratosthene


+ Mc ch: lp bng cc s nguyn t nh hn hoc bng 1 s n cho trc. + Thut ton: S dng 1 bng bool isPrimeNumber[0..n+1] lu kt qu - Khi to: tt c cc s t 1->n l nguyn t. - Xa s 1 ra khi bng. - Lp: Tm 1 s nguyn t u tin trong bng sau xa tt c cc bi ca n trong bng. - Qu trnh lp kt thc khi gp s nguyn t >= sqrt(n). - Tt c cc s cha b xa trong bng l s nguyn t. + Code: Visual C# Code: public bool[] SeiveOfEratosthene(int n) { bool[] isPrime=new bool[n+1]; //khi to: cc s t 1->n c coi l nguyn t. for (int i = 0; i <= n; i++) { isPrime[i] = true; } isPrime[1] = false;

int k = 1; while (k <= (int)Math.Sqrt(n)) { k++; //Tm s nguyn t u tin while (!isPrime[k]) k++; //Xa cc bi ca k khi danh sch cc s nguyn t int j = 2; while (k * j <= n) { isPrime[k * j] = false; j++; } } return isPrime; }

Tm c s chung ln nht (GCD)


+ nh ngha: c s chung ln nht (Greatest Common Divisor) ca 2 s a v b, c nh ngha nh sau: gcd(a,b)=d <=> d l s ln nht trong tt c cc c chung ca a v b. + Thut ton: Gii thut Euclid, nh ngha qui nh sau: - gcd(a,0)=a - gcd(a,b)=gcd(b,a mod b) + Code: - qui: Visual C# Code: public int GCD(int a, int b) { if (b == 0) return a; else return GCD(b, a % b); } C++ Code: int GCD(int a,int b) { if (b==0) return a; else return GCD(b,a%b); } - Kh qui: Visual C# Code: public int GCD(int a, int b) { while (b != 0) { int temp = a % b; a = b; b = temp; } return a; } C++ Code: int GCD(int a, int b) { while (b != 0) { int temp = a % b; a = b; b = temp;

} return a; }

Tm bi s chung nh nht (lcm)


+ nh ngha: Bi s chung nh nht (Least Common Multiple) ca 2 s a v b c nh ngha LCM(a,b)=m <=> m l s nh nht trong tt c cc bi chung ca a v b. + Thut ton: Ta c cng thc:

+ Code: Visual C# Code: public int LCM(int a, int b) { return Math.Abs(a * b) / GCD(a, b); } C++ Code: int LCM(int a, int b) { return abs(a * b) / GCD(a, b); }

Tnh n giai tha (Factorial)


+ Cng thc: . Pht biu bng li: Giai tha ca 1 s nguyn dng n l tch tt c cc s nguyn dng nh hn hoc bng n.

+ Thut ton: Ta c thut ton qui nh sau: + Code: - qui: Visual C# Code: public long FactorialRecursively(int n) { if (n == 0) return 1; else return FactorialRecursively(n - 1) * n; } - Kh qui: Visual C# Code: public long Factorial(int n) { long result = 1; for (int i = 1; i < n+1; i++) { result *= i; } return result; } C++ Code:

long Factorial(int n) { long result = 1; for (int i = 1; i < n+1; i++) { result *= i; } return result; }

Tnh t hp chp k ca n
+ Cng thc: + Thut ton: - Tru b (Brute Force): s dng hm tnh giai tha.

- S dng vng lp: + Code: - C bp: Visual C# Code: public long binomialCoefficient(int n,int k) { return Factorial(n) / (Factorial(k) * (Factorial(n - k))); } - Tr tu: Visual C# Code: public long binomialCoefficient(int n, int k) { long res = 1; for (int i = 1; i <= k; i++,n--) { res = res * n / i; } return res; }

Thut ton sp xp quick sort


+ Gii thiu: Quick sort l 1 trong cc thut ton sp xp nhanh v n gin nht, c xut bi C.A.R. Hoare nm 1962. N hot ng da trn chin lc qui bng cch chia--tr. + tng: Dy cn sp xp a s c phn ra lm 2 phn, sao cho tt c cc phn t b trong phn th nht s lun nh hn mi phn t c trong phn th 2 (qu trnh chia-divide), sau 2 phn ny s c sp xp bng cch gi qui ti chnh th tc sp xp ny (qu trnh x l tng phn-conquer). Sau s kt hp 2 phn ny lai c 1 dy sp xp (kt hpcombine). Xem hnh

Bc u tin ca qu trnh phn on chnh l chn ra 1 phn t x dng so snh, tt c cc phn t nh hn x s c t vo phn 1, tt c cc phn t ln hn x s c t vo phn 2. Cc phn t bng x s c t gia (lu l cc phn t ny "ng" v tr ca n trong mng)

+ Qu trnh phn tch: Input: Dy a0, ..., an-1 c n phn t Output: Hon v cc phn t sao cho tt c cc phn t ca a0, ..., aj s lun nh hn cc phn t ca ai, ..., an-1 (i>j) Phng php:
Code:

Chn 1 phn t x gia lm phn t so snh. Gn i=0 v j=n-1 while (i<=j) - Tm phn t ai u tin ln hn hoc bng x - Tm phn t aj u tin nh hn hoc bng x if (i<=j) i ch ai v aj gn i=i+1, j=j-1 Sau khi phn on, gii thut s p dng qui tng t qu trnh trn i vi 2 phn va to ra, qu trnh qui ny s kt thc khi on cn sp xp ch c duy nht ng 1 phn t. + Code: Visual C# Code: void quicksort (int[] a, int lo, int hi) { // lo is the lower index, hi is the upper index // of the region of array a that is to be sorted int i=lo, j=hi, h; // comparison element x int x=a[(lo+hi)/2]; // do { partition

while (a[i]<x) i++; while (a[j]>x) j--; if (i<=j) { h=a[i]; a[i]=a[j]; a[j]=h; i++; j--; } } while (i<=j); // recursion if (lo<j) quicksort(a, lo, j); if (i<hi) quicksort(a, i, hi); } + nh gi: Trng hp tt nht cho thut ton quick sort, l mi ln gi qui s chia ra c 2 phn c di bng nhau, sp xp n phn t, phc tp thi gian cho n s l (n log(n)). Do " su" ca li gi qui l log(n) v ti mi mc s c n phn t c tc ng (Hnh a). Trng hp xu nht khi mi ln gi qui s chia ra 2 phn c di khng cn bng, c ngha l 1 phn ch cha c 1 phn t, cc phn t cn li s nm trong phn 2 (Hnh c). Khi " su" ca li gi qui s l O(n-1) v thi gian chy s l (n2). Trng hp trung bnh ca qu trnh phn on c ch ra trong hnh b.

Vic chn phn t x so snh s quyt nh kt qu ca qu trnh phn on. Gi s chn x l phn t nh nht trong on, th ta s ri vo trng hp xu nht. V vy, s tt hn nu chn phn t x mang gi tr trung bnh trong dy. Khi x l phn t ln th n/2 trong dy (trung v), th qu trnh phn on l ti u. Trn thc t, c th tnh gi tr trung v trong thi gian tuyn tnh. Cc bin dng khc nhau ca thut ton quick sort ny s chy trong khong thi gian O(n log(n)) ngay c trong trng hp xu nht. Tuy nhin, v p ca thut ton quick sort li nm trong chnh s n gin ca n, dng n gin ca quick sort s chy trung bnh trong khong thi gian O(n log(n)). Mc d, trong trng hp xu nht phc tp ca n vn l (n2). _____

Kim tra s chnh phng


+ nh ngha: S chnh phng (SquareNumber) l s c cn bc 2 l 1 s nguyn. V d: 4,9,100... + Thut ton: kim tra n c phi s chnh phng hay khng ta ly phn nguyn ca cn bc 2 ca n ri bnh phng, sau so snh vi n. V d: sqrt(4)=2.0 Ta thy 2^2=4 => 4 l s chnh phng sqrt(7)=2.4657 , phn nguyn l 2. Ta thy 2^2 <> 7 => 7 khng phi s chnh phng. + Code: Visual C# Code: public bool isSquareNumber(int n) { int temp = (int)Math.Sqrt(n); return (temp * temp == n); }

Tm kim nh phn (Binary Search)


+ S lc: Tm kim nh phn l thut ton nhm xc nh v tr ca 1 phn t trong 1 mng c sp xp. Thut ton hot ng da trn vic so snh gi tr phn t u vo vi phn t gia (middle) ca dy. Vic so snh s cho bit phn t gia ny bng, nh hn hay ln hn gi tr u vo. Khi phn t c em so snh m bng input th vic tm kim s kt thc v tr v v tr ca phn t . Nu phn t ny nh hn input th ng ngha vi vic ta cn tm input trong on t middle+1..top, ngc li nu ln hn input th ta cn tm input trong on bottom..middle-1. Khi dy ti bc hin ti khng c phn t no (bottom>top) th khng cn tm kim. Kt thc qu trnh tm kim nu khng thy input xut hin trong dy th kt qu tr v -1. + Code: Visual C# Code: public int BinarySearch(int[] a, int value, int { while (bottom <= top) // trong khi dy ang { int middle = (bottom + top) / 2; if (a[middle] == value) return middle; qu trnh tm kim dng. else if (a[middle] > value) top = middle bottom..middle-1 else bottom = middle + 1; middle+1..top } bottom, int top) xt cn phn t // - 1; tm thy ti v tr middle, // cn tm value trong on // cn tm value trong on

return -1; }

//Khng tm thy

Ch : + phc tp ca thut ton l O(log(n)) + Thng thng gi tr bottom v top ban u tng ng vi 0 v N-1.

S hon ho (Perfect Number)

+ nh ngha: S hon ho l s c tng cc c nh hn n bng chnh n. V d: 6 = 1+2+3. 28 = 1+2+4+7+14. + Thut ton: kim tra n c phi Perfect Number hay khng, i tm tng tt c cc c nh hn n ri so snh. + Code: C++ Code: bool isPerfectNumber(int n) { int sum = 0; for (int i = 1; i <= n/2; i++) { if (n % i == 0) sum += i; } return sum == n; } __________________

Kim tra s nguyn t cng nhau


+ Tc gi: Peterdrew, link tham kho http://forums.congdongcviet.com/showthread.php?t=37060 (postcount==8) + t vn : Trong khi thao tc vi cc con s nhiu lc cc bn gp phi cm t hai s nguyn t cng nhau!; lc c bn ngh rng phi l 2 s nguyn t gn nhau. H, sai mt ri ; vy nn trong Vn 5 Peter khi qut qua (dn cc bn trc khi vo vn ny) l: Hai s nguyn dng a v b c gi l nguyn t cng nhau khi v ch khi c chung ln nht ca chng l 1; tc l (a,b)=1; ch khng hn a v b phi l 2 s nguyn t ng gn nhau (hoc c mt ci hiu tng t), d nhin nu a v b l hai s nguyn t khc nhau th chng cng tho mn tnh cht l hai s "nguyn t cng nhau" (Ln ln qu, nhng cc bn ch cho iu ny). + Phng php: Vy lm sao kim tra chng nguyn t cng nhau hay khng? Rt n gin l (k hiu hm l CoPrime()): - Nu c chung ln nht ca chng khc 1 th tr tr v cho hm kim tra l 0, bo hiu hai s khng nguyn t cng nhau. - Ngc li, th tr tr v cho hm kim tra l 1, bo hiu hai s nguyn t cng nhau. + Code: C++ Code: int CoPrime(int m,int n) { return gcd(m,n)==1?1:0; } + Ch : Bn no hc l thuyt mt m ri, chc hn l hiu ci kim tra ny quan trng th no, d ch c 1 dng code th kia thi. __________________

S cc c s nguyn dng ca mt s nguyn dng

+ Tc gi: Peterdrew, link tham kho http://forums.congdongcviet.com/showthread.php?t=37060 (postcount==9) + t vn : Trong ton l thuyt s th vn v lit k cc c nguyn dng ca mt s nguyn dng chim mt v tr cng kh quan trng, s cc c s nguyn dng ca mt s nguyn dng n c cho bi cng thc sau: Cc bn thng gp mt bi ton ph bin l Phn tch mt s ra tch cc tha s nguyn t (m ngy xa hc lp 6 Peter mi c tip cn); nhn thy cc bn gii quyt chng kh n gin bng cc vng lp for. l: + Code: C++ Code: int NoOfDivisor(int n) { int dem=0; for (int i=1;i<=(int)sqrt(n);i++) if (n%i==0) dem++; return dem; }

Thut ton Knuth-Morris-Pratt


+ Tc gi: Chuyn gia khoa hc my tnh NQH + t vn : Pattern matching l mt trong nhng bi ton c bn v quan trng nht ca ngnh my tnh. Tm patterns trong cc chui-DNA l bi ton c bn ca sinh tin hc. Cc phn mm qut virus hin i c my chc triu patterns l cc ch k (virus signature) ca cc con virus my tnh bit. Khi qut my th phn mm phi tm cc patterns ny trong cc files hay b nh ca my. Mi pattern thng l mt chui bytes nht nh. Lnh grep chng ta thng dng trong Unix cng lm tc v tng t, trong cc patterns c th c biu din bng cc biu thc chnh quy (regular expressions). Nu ch tnh cc thut ton tm cc xut hin ca mt chui n (mt chui cc k t cho sn) bn trong mt chui khc thi th ta c n c trm thut ton khc nhau. Knuth-Morris-Pratt (KMP) l mt trong nhng thut ton . KMP khng phi l thut ton nhanh nht hay tn t b nh nht trn thc t. Trn thc t cc bin th ca thut ton Boyer-Moore hay Rabin-Karp vi hm bm v b lc Bloom thng c dng. Ta s ni v chng sau. Nhng KMP tht s rt thanh lch v nu tc v tm kim khng gh gm qu th KMP khng km Boyer-Moore l my. tng ca KMP rt n gin. Nu bn c n trong quyn CLRS (Introduction to Algorithms) th bn s b lc trong sa mc. Tht s l CLRS lm cho mi th phc tp hn cn thit. Qu nhiu k hiu v qu t trc quan. Ta s tho lun KMP dng 2 bc. Bc 1 l thut ton Morris-Pratt (1970, A linear pattern-matching algorithm, Technical Report 40, UC Berkeley). Bc 2 l mt ci tin ca thut ton MP, c thm Knuth vo (1977, Fast pattern matching in strings, SIAM Journal on Computing 6(1):323-350). Mc d hai bi bo cch nhau 7 nm, tht ra l thut ton ny c khm ph t khong 1969 vi mt lch s th v. Phn cui bi bo ca KMP m t chi tit lch s ny. C phn k thut ln lch s trong bi bo u rt chi tit, kiu Knuth, c rt thch. 1. Thut ton Morris-Pratt MP l thut ton thi gian O(n) u tin cho bi ny. tng ca thut ton MP l nh sau. Gi s ta mun tm pattern p[0..m-1] trong chui s[0..n-1]. n mt lc no th ta c mis-match: s[j] != p[i] nh trong hnh sau:

Nu dng thut ton c bp (iu m bn nn lm khi i phng vn ngi ta hi vit strstr() ln bng) th ta dch p mt v tr v lm li t u. Thi gian chy s l O(mn). Ti! Nhng m lm li t u th rt ph cng chng ta so snh n s[j]. Ta tm cch dch p i xa hn. Cng xa cng tt min l khng b l qua mt xut hin ca pattern trong chui s. D thy rng, gi v tr ca j khng i th ta phi dch p i mt on sao cho mt tin t (prefix) ca p[0..i-1] c xp trng bng mt hu t (suffix) ca p[0..i-1], ti v on hu t ny c so trng vi on hu t cng chiu di ca s[0..j-1]. Khi , ta ch cn tip tc so snh s[j] vi p[map[i]] m khng cn lm li t u. Trong , map[i] < i ch ch cho ta bit x dch p nh th no. Chiu di ca s x dch (bng vi i lng i - map[i]) c gi l mt chu k (period) ca chui p[0..i-1]. Phn tin t v hu t trng khp vi nhau c gi l bin (border) ca chui p[0..i1]. Chiu di ca bin bng i tr i chu k. cho s x dch c ngha, chu k phi ln hn 0 v v th bin ca p[0..i-1] lun c chiu di nh hn i. trnh trng hp b b st mt xut hin ca p trong s th ta phi chn bin di nht ca p[0..i-1], k hiu l border(p[0..i-1]). Trong thut ton MP ta tnh trc dy map. Sau dng dy map ny so snh hai chui. Cht ch hn, vi mt chui x bt k, nh ngha w = border(x) l chui w di nht tha mn 0 |w| < |x| sao cho w va l tin t va l hu t ca x, ngha l x = wy = zw, trong y, z l cc chui no . Lu rng 0 < |y| = |z| = period(x). By gi gi s ta c bng map[0...m], trong map[0] = -1 v map[i] = |border(p[0..i-1])| vi 1 i m. Thut ton Morris-Pratt c th c vit nh sau: Python Code: def MP(s, p): # print all occurrences of pattern p in string s map = compute_MP_map(p) i = 0 n = len(s); m = len(p) for j in range(n): while ( (i >= 0) and (s[j] != p[i]) ): i = map[i] i = i+1 if (i == m): print "Match at position ", j-m+1 i = map[i] Ta phn tch thi gian chy ca MP dng phng php phn tch khu hao (Amortized Analysis). Ta cho mi ch s[j] 2 ng xu dng. V tng tng bn p[i] l m ci r. Lc u b vo r p[0] mt ng xu lm vn. Mi ln php so snh k t dng 6 c chy th ta dng ng xu c sn trong r p[i] tr n cho php so snh ny. (Lu rng ta gi s nu i=-1 th khng c php so snh. Nu bn cn thn bn c th b i iu kin ca while ra trnh truy cp p[-1]. on Python trn ti chy, khng c vn g.) Xong ri n cui, ngay trc khi thc hin php gn i = i+1 dng 8 ta ly 2 ng xu ca s[j] b vo p[i] v p[i+1]. Nh vy thi gian chy ca MP l O(n), v n ch dng nhiu nht 2n php so snh. Vn tip theo l lm sao tnh map. y l mt bi ton quy hoch ng hay. Lu rng bin ca bin ca mt chui x cng l bin ca x. Gi s ta mun tnh map[i+1] = |border(p[0..i])|. D thy rng, nu p[i] = p[map[i]] th map[i+1] = map[i] + 1. Nu p[i] != p[map[i]] th ta so p[i] vi p[map[map[i]]], vn vn. T ta c on m sau: Python Code: def compute_MP_map(p): m = len(p) # p is the input pattern map = [-1]*(m+1) # map[0..m], the Morris-Pratt border map i = 0; j = map[i] while (i < m): while ( (j >= 0) and (p[i] != p[j]) ): j = map[j]

j = j+1; i = i+1 map[i] = j return map Bi tp: dng phng php phn tch khu hao tng t nh trn, chng minh rng thi gian chy ca compute_MP_map() l O(m). Chy th: C++ Code: >>> MP("abcabcabcabc", "cabc") Match at position 2 Match at position 5 Match at position 8 2. Thut ton Knuth-Morris-Pratt KMP ci tin map mt cht. Trong hnh trn, nu p[map[i]] = b th ta li c mis-match. Do , ta p t mt c "dm trc" (look ahead) khi tnh map. Gi MPmap l dy map ca thut ton MP. Ci map ci tin ca thut ton KMP c nh ngha nh sau. KMPmap[0] = -1. Vi 1 i m-1 th gi j = MPmap[i]. Khi , nu p[i] != p[j] th KMPmap[i] = j. Nu p[i] == p[j] th KMPmap[i] = KMPmap[j]. V cui cng, KMPmap[m] = MPmap[m]. Bn nn ngh cn thn xem ti sao nh ngha KMPmap nh vy l hu l. D nhin, nu tnh MPmap ri th tnh KMPmap theo cng thc trn d dng thi. Nhng ta c th vit hm tnh KMPmap trc tip. y l mt bi tp lp trnh rt hay! Trong Python c th vit nh sau: Python Code: def compute_KMP_map(p): m = len(p) # p is the input pattern map = [-1]*(m+1) # map[0..m], the Knuth-Morris-Pratt border map i = 1; map[i] = 0; j = map[i] while (i < m): # at this point, j is MP_map[i], which is not necessarily KMP_map[i] if (p[i] == p[j]): map[i] = map[j] else: map[i] = j while ( (j >= 0) and (p[i] != p[j]) ): j = map[j] j = j+1; i = i+1 map[m] = j return map def KMP(s, p): # print all occurrences of pattern p in string s map = compute_KMP_map(p) i = 0; j = 0 n = len(s); m = len(p) for j in range(n): while ( (i >= 0) and (s[j] != p[i]) ): i = map[i] i = i+1 if (i == m): print "Match at position ", j-m+1 i = map[i] >>> KMP("abcabcabcabc", "cabc") Match at position 2 Match at position 5 Match at position 8

im th v cui cng l, mi k t ca chui s c so snh vi nhiu nht l gi l delay ca thut ton), trong l t l vng! + Code hon chnh: Visual C# Code: using System; namespace Knuth_Morris_Pratt { class Test { private char[] s; private char[] p; public void Nhap() { Console.Write("Nhap xau S:"); string stdin1 = Console.ReadLine(); s = new char[stdin1.Length]; s = stdin1.ToCharArray(); Console.Write("Nhap xau P:"); string stdin2 = Console.ReadLine(); p = new char[stdin2.Length]; p = stdin2.ToCharArray(); }

(i lng ny

private int[] compute_MP_map() // map[i]=| border(p[0..i-1]) | { int m = p.Length; // p is the input pattern int[] MP_map = new int[m + 1]; // lu rng ta phi tnh map[0..m] // init MP_map[0] = -1; // ci ny chc ai cng hiu // bay gio di tinh map[1..m] int i = 0; int j = MP_map[i]; while (i < m) { while (j >= 0 && (p[i] != p[j])) j = MP_map[j]; j++; i++; MP_map[i] = j; } return MP_map; } private int[] compute_KMP_map() //thut ton KMP ci tin { int m = p.Length; int[] KMP_map = new int[m + 1]; int[] MP_map = compute_MP_map(); KMP_map[0] = -1; KMP_map[m] = MP_map[m]; for (int i = 1; i < m; i++) { int j = MP_map[i]; if (p[i] != p[j]) KMP_map[i] = j; else KMP_map[i] = MP_map[j]; } return KMP_map; } public void Morris_Pratt() { int[] map = compute_KMP_map();

int n = s.Length; int m = p.Length; int i = 0; string res = ""; for (int j = 0; j < { while ((i >= 0) i++; (i=m-1) hoc l i=-1 , li dng if (i == m) { res += (j i = map[i]; } } Console.Write(res); }

n; j++) && (p[i] != s[j])) i = map[i]; // C 2 kh nng xy ra: hoc l i ht chui p c 2 iu ny m + 1).ToString() + " ";

static void Main(string[] args) { Test object1 = new Test(); object1.Nhap(); object1.Morris_Pratt(); //Console.WriteLine("done"); Console.ReadLine(); } } }

Lit k dy nh phn c di n
+ V d: n=3 ta c cc dy nh phn nh sau
Code:

0 0 0 0 1 1 1 1

0 0 1 1 0 0 1 1

0 1 0 1 0 1 0 1

+ Tc gi: CayDan + Code: - Phng php sinh: C Code: void LKNhiPhan(int n) { int x[30]; for (int i=0; i<n; i++) x[i] = 0; int i=n; while (i>=0) { for (i=0; i<n; i++) printf("%d ",x[i]); printf("\n"); i=n-1;

while ((i>=0) && (x[i] == 1)) i--; if(i>=0) { x[i] = 1; for (int j= i+1; j<n; j++) x[j] = 0; } } } - Phng php qui: C Code: int x[30]; void Try(int i, int n) { for (int k=0; k<=1; k++) { x[i] = k; if (i==n-1) { for (int j=0;j<n;j++) printf("%d ",x[j]); printf("\n"); } else Try(i+1, n); } } void LKNhiPhan(int n) { Try(0, n); }

m s phn t khc nhau ca mng


+ Tc gi: XuyenIT55 + V d minh ha: {-3,0,2,-3,-3,2,1} => c -3,0,2,1 => kt qu = 4. + Gii thut: -Sp xp mng. -Kim tra nu a[i]!=a[i-1] th tng bin m ln 1 + Code: C++ Code: int Count(int a[], int n) { if (n<0) return 0; sort(a,0,n-1); int dem=1; for ( int i = 1 ; i < n ; i++) { if ( a[i] != a[i-1]) dem++; } return dem; }

Kim tra 1 s nguyn t ln (Thut ton Miller-Rabin)

+ Tc gi: hunterphu + Code: C++ Code: bool isprime(unsigned long long n) { if(n==1) return false; for (unsigned long long i=2;i*i<=n;i++) if(n%i==0) return false; return true; } unsigned long long power(unsigned long long base,unsigned long long exp,unsigned l ong long mod) { unsigned long long res=1; while (exp>0) { if (exp%2==1) res=(res*base)%mod; exp/=2; base=(base*base)%mod; } return res; } bool miller_rabin(unsigned long long n,int t) { if (n<=50) return isprime(n); unsigned long long m=n-1; int r,k=0; if (n%2==0)return false; while (m%2==0) { m=m/2; k++; } for (int i=0;i<t;i++) { r=k; unsigned long long a=rand()%(n-2)+2; unsigned long long b=power(a,m,n); if (b!=1&&b!=n-1) { while (r>=0) { b=power(b,2,n); if(b==n-1)break; r--; } if (r<0)return false; } } return true; }

m s ch s ca s nguyn
+ V d: x=3022 => kt qu 4 x=140017 =>Kt qu 6 + Code: - Tc gi: Peterdrew

Cch 1: C++ Code: int dem=0; while(n) { dem++; n/=10; } Cch 2: C++ Code: floor(log10(abs(n!= 0?n:1)))+1; Lu : Phi include th vin math.h - Tc gi: Aydada C++ Code: int Count(int x) { char a[33];//(sizeof(int)*8+1) itoa(x, a, 10) return strlen(a); } - Tc gi: Vietduc C++ Code: int so_chu_so(int n){ return n? so_chu_so(n/10)+1 : 0; }

Thut ton kim tra s nguyn t (Full + Advanced)


+ Tc gi: mp121209 && Rox_Rook + Ni dung: Kinh nghim cho thy rng ngn ng lp trnh, trong mt gii hn no , l cng c chng ta m hnh v gii quyt cc bi ton thc tin t n gin nht cho n phc tp nht. Bi ton m ti mun nhc ti y bao gm cc bi ton trong ton hc ni ring, hoc mt bi ton no , mt cng vic c th no trong thc t. Bi vit ny s gii quyt vn Kim tra tnh nguyn t ca mt s nguyn dng v mt vi vn khc lin quan n n. Khi nim ton hc: (nh ngha s nguyn t) S nguyn t l mt s nguyn dng, ch c hai c s phn bit l 1 v chnh n. T nh ngha chng ta hy phn tch i cht v tnh cht ca chng. S 1 c c l 1 v chnh n, nhng trng nhau, suy ra, 1 khng phi l s nguyn t. S 2 l s nguyn t chn duy nht, v cng l s nguyn t nh nht. Cc s nguyn t cn li l s l. Gi s s nguyn t l s chn, suy ra n c dng 2 * n, n l mt s t nhin ln hn 1. Nhng 2 * n chia ht cho 2, suy ra, khng phi nguyn t. T ton hc n tin hc: Ta r tnh cht ca cc s nguyn t. Nhng s nguyn t dng lm g? V sao

chng ta li cn tm chng? Chng ta khng nghin cu su v vn ny, m gi s rng, mt ni no s nguyn t ng mt vai tr ht sc quan trng. Chng hn, trong ngn hng , chng c s dng m ha ti khon, ... V nhim v ca bn l phi tm chng, hoc quy lut pht trin ca chng. t bi ton: u vo: S nguyn dng N ( n gin, gi s N khng qu ln, kiu int trong C/C++ hin thc ha). u ra: True nu N l s nguyn t, False nu N khng phi l s nguyn t. ( tit kim khng gian b nh v gim kch thc chng trnh ti dng kiu bool vi hai gi tr l true (ng), v false (sai) lu gi tr tr v ca vic check tnh nguyn t ca s N). Gii quyt bi ton: Nh vy, kim tra mt s c l nguyn t hay khng, theo suy ngh trc quan ca tt c cc lp trnh vin, thm ch nhng ngi khc khng hiu g v ton hc v thut ton, m ch bit nhng thng tin trong phm vi bi vit ny, th chng ta cn kim tra xem s c c s no khc ngoi 1 v chnh n hay khng, nu c th l hp s (combine number) cn nu khng th s l s nguyn t. Thut ton u tin v n gin nht hin ra trong u chng ta lc ny c l l: Kim tra cc s c kh nng l c sca N (s cn kim tra tnh nguyn t), cc s ny nm trong on [2,N-1]. Thut ton c ci t n gin nh sau: C++ Code: // the first algorithm check a number to see // if it is a prime number. we have to check // all values in range [2,n-1] and assert if // any of them is a divisor of n. // input: a positive integer n // output: true if n is prime, otherwise -false bool check_prime (const int &n) { // 1 is not a prime if (n == 1) return false; // if well find any divisor of n, then n is a combine for (int i = 2; i < n; i ++) if (n % i == 0) return false; // in the end, n is a prime return true; } Cn c nhiu cch ci t tng ng, nhng ti ch a ra mt cch in hnh. cch ci t ny, vng lp for s chy t 2 n N 1 c th a ra kt lun cui cng. Tuy nhin, nu suy ngh thm mt cht chng ta s thy rng khng cn thit phi kim tra n gi tr N 1 m thc cht ch cn ti [N/2] ([] l k hiu ly phn nguyn) v khng c no ca n c th ln hn [N/2] tr chnh n! Thut ton trn c ci t li nh sau: C++ Code: // the second algorithm bool check_prime (const int &n) { // 1 is not a prime if (n == 1) return false; // if well find any divisor of n, then n is a combine

// note, you should save n/2 // step up the computational // int m = n/2; // for (int i = 2; i <= m; i for (int i = 2; i < n / 2; i if (n % i == 0) return false; // in the end, n is a prime return true;

in a temporary variable to process. ++) {...} ++)

} Tuy nhin, nu suy ngh thm mt cht, chng ta thy rng khng cn phi kim tra n N/2, m ch cn n cn bc hai ca N, [sqrt(N)] l . Ti sao li nh vy? Rt n gin nu cc bn chu kh suy ngh mt cht! V th, thut ton 2 li c ci t li nh sau: C++ Code: // the third algorithm bool check_prime (const int &n) { // 1 is not a prime if (n == 1) return false; // if well find any divisor of n, then n is a combine for (int i = 2; i <= sqrtl(n); i ++) if (n % i == 0) return false; // in the end, n is a prime return true; } Xem ra c v thut ton ca chng ta tm n, v chng trnh chy tng i nhanh! Tuy nhin, nh phn tch t u, s nguyn t l cc s l, tr s 2. V th chng ta ch cn kim tra cc c s ca N l cc s l, nu chng khng phi l c s ca N th N chnh l nguyn t, ngc li, l hp s. Thut ton 3 c ci tin thnh thut ton 4, nh sau: C++ Code: // the fourth algorithm bool check_prime (const int &n) { // 2 is prime if (n == 2) return true; // 1 is not a prime // each even number is not a prime if (n == 1 || n % 2 == 0) return false; // if well find any divisor of n, then n is a combine // you should save the value of sqrtl(n) in a temporary // variable, otherwise program will calculate sqrt and // call function sqrtl, it will take a long time ... long j = sqrtl(n); for (int i = 3; i <= j; i += 2) if (n % i == 0) return false; // in the end, n is a prime return true; } R rng l so vi thut ton trc , s gi tr ca i cn kim tra gim i mt na. Nh vy, mu cht trong vic tng tc v ci tin thut ton nm cu lnh thay i gi tr ca biu thc iu khin bin i, ta cn gim s gi tr ca i cn kim tra n minimum th s t c hiu qu maximum ca thut ton. Va ri ta loi b c mt na s gi tr ca i bng cch xt c s 2 c th ca N. Tip theo ta s ci tin thut ton bng

cch xt c s nguyn t tip theo ca N l 3. Nu N chia ht cho 2, hoc 3 th d dng kt lun n l hp s (combine). Ngc li, N s khng chia ht cho 2 * 3 = 6. Vy c s ca N s c dng 6 * i + 1, 6 * i + 2, 6 * i + 3, 6 * i + 4, 6 * i + 5. rng 6 * i + 2 v 6 * i + 4 l bi s ca 2, cn 6 * i + 3 l bi s ca 3. V th, c s c th c ca N ch cn li 6 * i + 1, hoc 6 * i + 5, cch nhau 2 n v! Ta s bt u vi gi tr i = 5 v s chn cng thc 6 * i + 5. Tuy nhin nu ch kim tra i th s thiu mt ng c vin dng 6 * i + 1. V th ta ch cn thm i + 2 vo cho . (Lu , i = 6 * j + 5; v th iteration tip theo ta c j = j + 1; i + 2 = 6 * (j + 1) + 2 = 6 * j + 7. iu ny cho thy 6 * i + 1 v 6 * i + 4 cch nhau 2 n v! C ngi bo rng chng cch nhau 4 n v, nhng d thy 6 4 = 2. hiu thm v s gii thch ny, cc bn c th tm c bi vit ny ca tc gi Rox_Rook. V th 4 n v iteration trc s cn li 2 n v iteration sau m thi!). Thut ton mi s nh sau: C++ Code: // the fifth algorithm bool check_prime (const int &n) { // 2 is prime, 3 is prime if (n == 2 || n == 3) return true; // 1 is not a prime // each even number is not a prime if (n == 1 || n % 2 == 0 || n % 3 == 0) return false; long j = sqrtl(n); for (int i = 5; i <= j; i += 6) if (n % i == 0 || n % (i + 2) == 0) return false; // in the end, n is a prime return true; } Mt s phn tch ton hc n gin s gip chng ta nhn thy rng nu ban u chng ta t i = 5; th iteration tip theo gi tr ca i s cch 5 ng 2 n v, tc l i += 2; iteration tip th i li tng ln 4 n v, nh phn tch bc trn. Ta c th ci t li thut ton th 5 thnh thut ton 5, gi l thut ton nhy cc 2, 4 kim tra s nguyn t nh sau. Lu : Thut ton 5 v thut ton 5 trn thc t l tng ng, khng thut ton no pht huy tnh hiu qu hn! C++ Code: // the fifth' algorithm bool check_prime (const int &n) { // 2 is prime, 3 is prime if (n == 2 || n == 3) return true; // 1 is not a prime // each even number is not a prime if (n == 1 || n % 2 == 0 || n % 3 == 0) return false; long j = sqrtl(n); int k = 2; for (int i = 5; i <= j; i += k, k = 6 - k) if (n % i == 0) return false; // in the end, n is a prime return true; }

Trn thc t, khi chng ta phi lm vic vi d liu ln v s lng ln kch thc th vic x l trn mt i tng thng lp li nhiu ln. Thut ton tm s nguyn t cng c ci thin. Khi kim tra tnh cht nguyn t ca mt s, ngi ta ch kim tra cc c s c th, nhng l nguyn t (v mt c s nu l hp s, th n li chia ht cho mt s nguyn t nh hn. nh l ton hc: Mi hp s u c th phn tch thnh tch cc tha s nguyn t). V vy ta s sinh trc mt mng cc s nguyn t (v bn cht l nh du cc s l nguyn t) khng vt qu gii hn c s ca N. Sau kim tra c c ca n ch cn kim tra xem n c chia ht cho cc s nguyn t nh hn hoc bng sqrt(N) c nm trong mng to khng. Thut ton ny l thut gii sng Erastosthene. Nu cc bn quan tm c th tm c, ti khng cp n y! T vic phn tch mt bi ton nh trn, ti hi vng mang li cho cc bn mt s lu tm, mt cht suy ngh no . Bi vit trnh by theo cch xy dng bi ton mang tnh cht k tha v pht trin. T vic phn tch bi ton, v gin s lc, n ci t thut gii v ti u n. cng chnh l t tng cho vic t duy gii quyt mi vn , cng l c trng c bn v tnh k tha m cc bn s c lm quen, v phi hiu r khi hc tp v nghin cu C++. __________________

Phn tch mt s thnh tha s nguyn t

+ Problem: Phn tch 1 s thnh tha s nguyn t v a ra kt qu di dng (m1, n1)(m2,n2).... Trong m(i) l tha s nguyn t, cn n(i) l s m. v d: 18= (2,1)(3,2) 50= (2,1)(5,2) + Written by: mp121209 + Code: C++ Code: #include <iostream> int main () { int n; std::cin >> n; int count = 0; for (int i = 2; i <= n; i ++) { while (n % i == 0) { count ++; n /= i; } if (count ) { std::cout << "(" << i << "," << count << ")" << std::endl; count = 0; } } } + Test Result:
Code:

105 (3,1) (5,1) (7,1) Press any key to continue . . .

+ Proof: Mt s khng phi l s nguyn t lun lun biu din c di dng tch cc tha s l nguyn t. Ta s ln lt chia s cn biu din cho s nguyn t nh nht l 2, sau tng dn gi tr ln 3, 4, 5, 6. Tt nhin bn s thy 4, 6 ... khng phi l s nguyn t, nhng thut ton s khng sai, v mt s chia ht cho 4 khi v ch khi n chia ht cho 2*2, tc l ta thc hin vng lp chng no ln, n khi gi tr ca s b chia n khng cn chia ht cho s chia na th mi tng s chia i ln. Mi ln chia cho i, s b chia s gim i i ln, tc l gi tr ca n cn li n/i. Lp cho n khi s chia to bng s b chia th dng Trng hp ny ch xy ra nu s b chia l nguyn t __________________

Code C
bool isPrime(int n) { if(n==2 || n==3 ) return true; if(n%2 ==0 ) return false; if(n%3 == 0 ) return false; int i=5,j=2; while(i*i <= n) { if(n%i == 0 ) return false; i+= j; j = 6-j; } } Vi thut ton trn th chung trnh s chy nhanh hn rt nhiu nht l khi N l s nguyn tung i ln.

You might also like