SlideShare une entreprise Scribd logo
1  sur  99
I. MẢNG MỘT CHIỀU
1. Xây dựng giải thuật và viết hàm nhập mảng bằng tay
void nhapmang( int a[], int &n)
{
cout<<" Nhap so phan tu: "; cin>> n;
for (int i=0;i<n;i++)
{
cout<< " a["<<i<<"]: "; cin>>a[i];
}
}
2. Xây dựng giải thuật và viết hàm nhập mảng ngẫu nhiên
#include<time.h> // thư viện dùng cho hàm srand(), random theo thời gian.
#include<stdlib.h> //thư viện dùng cho hàm rand(), phát sinh số ngẫu nhiên.
void nhap_random( int a[], int &n)
{
srand(time(0)); rand();
cout<<" Nhap so phan tu: ";
cin>> n;
for (int i=0;i<n;i++)
{
a[i]=rand()%100; // giá trị phần tử random trong khoảng 0- 99
}
cout<<"n";
}
3. Xây dựng giải thuật và viết hàm nhập mảng đệ quy
void nhap_de_quy(int *&a,int n)
{
if(n==0)
return;
nhap_de_quy(a,n-1);
cout<<" Nhap a["<<n-1<<"]: ";
cin>>a[n-1];
}
4. Xây dựng giải thuật và viết hàm xuất mảng
void xuat_mang(int a[],int n)
{
cout<<" cac phan tu mang:nn";
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
cout<<"n";
}
5. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong mảng một chiều n
số nguyên
int lon_nhat(int a[],int n)
{
int max=a[0];
for(int i=1; i<n; i++)
max=(a[i]>max)?a[i]:max;
return max;
}
6. Xây dựng giải thuật và viết hàm tìm giá trị dương đầu tiêntrong mảng, không
có trả về 0
int duong_dau(int a[],int n)
{
for(int i=0; i<n; i++)
if(a[i]>0)
return a[i];
return 0;
}
7. Xây dựng giải thuật và viết hàm tìm số chẵn cuối cùng trong mảng, không có
thì trả về 0
int chancuoi(int a[],int n)
{
for(int i=n-1; i>=0; i--)
if(a[i]%2==0)
return a[i];
return 0;
}
8. Xây dựng giải thuật và viết hàm tìm vị trí của phần tử nhỏ nhất trong mảng
int vt_min(int a[],int n)
{
int vtmin=0;
for(int i=1; i<n; i++)
if(a[vtmin]>a[i])
vtmin=i;
return vtmin;
}
9. Xây dựng giải thuật và viết hàm tìm vị trí của giá trị chẵn đầu tiêntrong
mảng, không có thì trả về 0
int vt_chandau(int a[], int n)
{
for(int i=0; i<n; i++)
if(a[i]%2==0)
return i;
return 0;
}
10. Xây dựng giải thuật và viết hàm tìm vị trí số hoàn thiện cuối cùng trong mảng,
không có trả về 0
int sohoanthien(int a) // hàm kiểm tra số hoàn thiện.
{
int tong=0;
for(int i=1; i<=a/2; i++)
if(a%i==0)
tong = tong + i;
if(tong==a)
return 1;
return 0;
}
int vt_hoanthiencuoi(int a[],int n) // hàm tìm vị tri số hoàn thiện.
{
for(int i=n-1; i>=0; i--)
if(sohoanthien(a[i])==1)
return i;
return 0;
}
11. Xây dựng giải thuật và viết hàm tìm vị trí dương nhỏ nhất trong mảng, không
có trả về 0.
int duongdau(const int a[], int n) // Hàm tìm pt dương đầu tiên
{
for(int i=0; i<n; i++)
if(a[i]>0)
return a[i];
return 0;
}
int vt_duongmin(const int a[], int n) //Hàm tìm vị trí của pt dương min
{
int vt, dmin=duongdau(a,n);
if(dmin==0)
return 0;
for(int i=0; i<n; i++)
if(a[i]>0 && a[i]<dmin)
{
dmin=a[i];
vt=i;
}
return vt;
}
12. Xây dựng giải thuật và viết hàm tìm số nguyên tố đầu tiêntrong mảng, không
có trả về 0.
int ngto(int a) // hàm kiểm tra 1 số có phải là nguyên tố không
{
if(a>=2)
{
for(int i=2; i<=a/2; i++)
if(a%i==0)
return 0;
return 1;
}
return 0;
}
int ngtodau(const int a[],int n) // hàm tìm số nguyên tố đầu tiên
{
for(int i=0; i<n; i++)
if(ngto(a[i])==1)
return a[i];
return 0;
}
13. Xây dựng giải thuật và viết hàm tìm số nguyên tố lớn nhất trong mảng, không
có trả về 0.
int ngto(int a)
{
if(a>=2)
{
for(int i=2; i<=a/2; i++)
if(a%i==0)
return 0;
return 1;
}
return 0;
}
int ngto_max(const int a[],int n) // hàm tìm số nguyên tố lớn nhất
{
int max=0;
for(int i=0; i<n; i++)
if(ngto(a[i])==1)
{
max=a[i]; break;
}
if(max==0)
return 0;
for(i=i+1;i<n; i++)
if(ngto(a[i])==1 && a[i] > max)
max=a[i];
return max;
}
14. Xây dựng giải thuật và viết hàm tìm số hoàn thiệncuối cùng trong mảng,
không có trả về 0.
int sohoanthien(int a) // hàm kiểm tra số hoàn thiện.
{
int tong=0;
for(int i=1; i<=a/2; i++)
if(a%i==0)
tong = tong + i;
if(tong==a)
return 1;
return 0;
}
int pt_hoanthien_cuoi(int a[],int n) // hàm tìm pt hoàn thiện cuối
{
for(int i=n-1; i>=0; i--)
if(sohoanthien(a[i])==1)
return a[i];
return 0;
}
15. Xây dựng giải thuật và viết hàm tìm số hoàn thiện nhỏ nhất trong mảng, không
có trả về 0.
int sohoanthien(int a)
{
int tong=0;
for(int i=1; i<=a/2; i++)
if(a%i==0)
tong = tong + i;
if(tong==a)
return 1;
return 0;
}
int hoanthien_min(const int a[], int n)
{
int min=0;
for(int i=0; i<n; i++)
if(sohoanthien(a[i])==1)
{ min=a[i]; break; }
if(min==0)
return 0;
for(i=i+1;i<n; i++)
if(sohoanthien(a[i])==1 && a[i]<min)
min=a[i];
return min;
}
16. Xây dựng giải thuật và viết hàm tìm giá trị chẵn nhỏ nhất trong mảng, không
có trả về 0.
int chan_min(const int a[],int n)
{
int min=0;
for(int i=0; i<n; i++)
if(a[i]%2==0)
{
min=a[i]; break;
}
if(min==0)
return 0;
for(i=i+1;i<n; i++)
if(a[i]%2==0 && a[i]<min)
min=a[i];
return min;
}
17. Xây dựng giải thuật và viết hàm tìm vị trí có giá trị âm lớn nhất trong mảng,
không có thì trả về -1.
int vt_am_max(int a[],int n)
{
int vtmax=-1;
for(int i=0; i<n; i++)
if(a[i]<0)
{
vtmax = i; break;
}
if( vtmax==-1)
return -1;
for(i=i+1;i<n; i++)
if(a[i]<0 && a[i]>a[vtmax])
vtmax=i;
return vtmax;
}
18. Xây dựng giải thuật và viết hàm tìm những phần tử trong mảng xa giá trị x
nhất.
void pt_xa_x_nhat(const int a[], int n, int x)
{
long kcxn= abs(a[0]-x); int j=0;
for(int i=1; i<n; i++)
if(abs(a[i]-x) > kcxn)
{
kcxn = abs(a[i]-x);
j=i;
}
cout<<"n Nhung gia tri xa "<<x<<" nhat:n";
for(j; j<n; j++)
if(abs(a[j]-x)==kcxn)
cout<<setw(3)<<" "<<a[j];
cout<<"n";
}
19. Xây dựng giải thuật và viết hàm tìm vị trí trong mảng mà giá trị tại đó gần x
nhất.
void vt_gan_x_nhat(const int a[], int n, int x)
{
long kcxn= abs(a[0]-x); int j=0;
for(int i=1; i<n; i++)
if(abs(a[i]-x) < kcxn && abs(a[i]-x)!=0)
{
kcxn = abs(a[i]-x);
j=i;
}
cout<<"n Nhung vi tri co pt gan "<<x<<" nhat:n";
for( j; j<n; j++)
if(abs(a[j]-x)==kcxn)
cout<<setw(3)<<" "<<j+1;
cout<<"n";
}
20. Xây dựng giải thuật và viết hàm tìm đoạn [a,b] sao cho đoạn này chứa tất cả
các giá trị trong mảng.
void timdoan(const int a[], int n)
{
int min, max; min = max = a[0];
for (int i=1; i<n; i++)
{
max = (max<a[i])?a[i] : max;
min = (min>a[i])?a[i] : min;
}
cout<< "n ["<<min<<","<<max<<"] la doan chua cac gia tri trong mang"<<endl;
}
21. Xây dựng giải thuật và viết hàm tìm trong mảng giá trị đầu tiên lớn hơn 2010,
không có trả về 0.
int dautien(const int a[] , int n)
{
for( int i=0 ; i<n; i++)
if(a[i]>2010)
return a[i];
return 0;
}
22. Xây dựng giải thuật và viết hàm tìm trong mảng giá trị đầu tiên nằm trong
khoảng (X,Y) cho trước, không có thì trả về X.
int dautientrongdoan(const int a[], int n, int x, int y)
{
for( int i=0; i<n; i++)
if ( a[i] >= x && a[i] <= y )
return a[i];
return x;
}
23. Xây dựng giải thuật và viết hàm tìm số chính phương đầu tiên trong mảng,
không có thì trả về 0.
int sochinhphuong(int a)
{
for (int i=1; i<=a/2; i++)
if (i*i==a)
return 1;
return 0;
}
int chinhphuongdautien(const int a[], int n)
{
for (int i=0; i<n; i++)
if (sochinhphuong(a[i])==1)
return a[i];
return 0;
}
24. Xây dựng giải thuật và viết hàm tìm một vị trí của phần tử đầu tiên có giá trị
bằng tích hai phần tử lân cận, nếu mảng không tồn tại phần tử thỏa điều kiện
trên thì trả về 0.
int tichlancan(const int a[], int n)
{
for ( int i=1; i< n-1; i++)
if (a[i]==((a[i-1])*a[i+1]))
return i;
return 0;
}
25. Xây dựng giải thuật và viết hàm tìm giá trị đầu tiêntrong mảng thỏa tính chất
số gánh không có thì trả về 0 ( ví dụ: 12321).
int soganh(int n)
{
int t=n;
if(n<=100)
return 0;
int du,dn=0;
while (t!=0)
{
du=t%10; dn=dn*10+du;
t=t/10 ;
}
if ( n==dn)
return 1;
return 0;
}
int timsoganh(const int a[], int n)
{
for ( int i=0; i<n; i++)
if ( soganh(a[i]) == 1)
return a[i];
return 0;
}
26. Xây dựng giải thuật và viết hàm tìm giá trị đầu tiêncó chữ số đầu tiênlà chữ
số lẻ trong mảng, không có thì trả về 0 ( ví dụ: 110).
int cs_dau_le(int n)
{
if(n<10) // vì phải tìm cs đầu tiên nên pt
return 0; // phải có từ hai số trở lên.
while (n>=10)
n=n/10;
if (n%2==0)
return 0;
return 1;
}
int ledautien(const int a[], int n)
{
for(int i=0 ; i<n; i++)
if (cs_dau_le(a[i])==1)
return a[i];
return 0;
}
27. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất toàn chữ số lẻ so với
những số cùng thỏa điều kiện trong mảng, không có thì trả về 0.
int toanchusole(int n)
{
int dv;
while (n!=0)
{
dv = n % 10;
if (dv % 2 == 0)
return 0;
n=n/10;
}
return 1;
}
int csle_max(const int a[], int n)
{
int max=0;
for(int i=0 ; i<n; i++)
if (toanchusole(a[i])==1)
{
max = a[i];
break;
}
if (max==0)
return 0;
for(i=i+1;i<n; i++)
if (toanchusole(a[i])==1)
max = (a[i]>max)?a[i]:max ;
return max;
}
28. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong mảng có dạng 2^k,
so với những số cùng thỏa điều kiện, nếu mảng không có phần tử dạng 2^k thì
trả về 0.
int dang2k(int n)
{
if(n==1) // so 2^k la so sau k lan chia lay nguyen cho 2 thi bang 1
return 1; // va kq moi lan chia phan nguyen deu chan.
while(n>=2)
{
if (n%2 != 0)
return 0;
n = n/2;
}
return 1;
}
int pt_2k_max(const int a[], int n)
{
int max=0;
for(int i=0 ; i<n; i++)
if (dang2k(a[i])==1)
{ max = a[i]; break; }
if (max==0)
return 0;
for(i=i+1;i<n; i++)
if (dang2k(a[i])==1)
max = (a[i]>max)?a[i]:max;
return max;
}
29. Xây dựng giải thuật và viết hàm tìm số chẵn lớn nhất, nhỏ hơn mọi giá trị lẻ có
trong mảng một chiều n số nguyên, nếu mảng chỉ chứa các phần tử lẻ hoặc
chẵn thì return 0.
int chanmax_lemin(const int a[],int n)
{
int min, max; max = min=0;
for (int i=0; i<n; i++)
if (a[i]%2!=0)
{
min = a[i]; break;
}
if(min==0)
return 0;
for (i=i+1 ; i<n; i++)
if (a[i]%2 !=0 && min>a[i])
min = a[i];
//---------------------
for (int j=0; j<n; j++)
if (a[j]%2==0 && a[j]<min)
{
max = a[j]; break;
}
if(max==0)
return 0;
for (j=j+1 ; j<n; j++)
if (a[j]%2==0 && max<a[j] && a[j]<min)
max = a[j];
return max;
}
30. Xây dựng giải thuật và viết hàm tìm số nguyên tố nhỏ nhất, lớn hơn mọi giá trị
có trong mảng.
int ngtomin_max(const int a[], int n)
{
int max=a[0];
for( int i=1; i<n; i++)
max=(a[i] > max) ?a[i] : max;
for (int k=max+1; k > max; k++)
if (ngto(k)==1)
break;
return k;
}
31. Xây dựng giải thuật và viết hàm liệt kê các phần tử thuộc đoạn [x,y] cho trước
trong mảng.
void lietke_XY( const int a[], int n, int x, int y)
{
int dem=0;
cout<<"n Cac pt trong doan ["<<x<<","<<y<<"]: ";
for (int i=0; i<n; i++)
if (a[i]>=x && a[i]<=y)
{ dem++; cout<<setw(3)<<a[i];
}
if(dem==0)
cout<<"n Khong co pt trong doan ["<<x<<","<<y<<"]: ";
cout<<"n";
}
32. Xây dựng giải thuật và viết hàm liệt kê các số trong mảng một chiều thỏa điều
kiện: lớn hơn trị tuyệt đối của số đứng liềnsau nó.
void lietke(const int a[], int n)
{
int dem = 0;
cout<<"n Cac pt lon hon tri tuyet doi cua pt lien sau: ";
for ( int i=0; i<n; i++)
if (a[i]>abs(a[i+1]))
{
dem++;
cout<<setw(3)<<a[i];
}
cout<<endl;
if (dem == 0)
cout<<" Mang co thu tu tang dan"<<endl;
}
33. Xây dựng giải thuật và viết hàm tính tổng các phần tử trong mảng một chiều n
số nguyên.
int tong(const int a[], int n)
{
int s=0;
for (int i=0; i<n; i++)
{
s+= a[i];
}
return s;
}
34. Xây dựng giải thuật và viết hàm tính tổng các phần tử dương trong mảng.
int tong_pt_duong (const int a[], int n)
{
int s = 0;
for (int i=0; i<n; i++)
if (a[i]>0)
{
s+= a[i];
}
return s;
}
35. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số đầu là lẻ trong
mảng, vd: 15, 30, ...
int cs_daule(int n)
{
if(n<10)
return 0;
while (n>=10)
n=n/10;
if (n%2==0)
return 0;
return 1;
}
int tongdaule(const int a[], int n)
{
int s=0;
for (int i=0; i<n; i++)
if (cs_daule(a[i])==1)
s+= a[i];
return s;
}
36. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số hàng chục là 5
trong mảng.
int hangchuc5(int a)
{
a=abs(a);
if(a<50)
return 0;
else
{
a=a/10; int c=a%10;
if(c==5)
return 1;
return 0;
}
}
int tong_hc5(const int a[], int n)
{
int s=0;
for (int i=0; i<n; i++)
if (hangchuc5(a[i])==1)
s+=a[i];
return s;
}
37. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn phần tử đứng
liềntrước nó trong mảng.
int tong_sau_truoc(const int a[], int n)
{
int s = 0 ;
for (int i=1; i<n; i++)
if (a[i]>a[i-1])
s+=a[i];
return s;
}
38. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn giá trị tuyệt đối
của phần tử đứng liềnsau nó.
int tong_lien_sau(const int a[], int n)
{
int s=0;
for (int i=0; i<n-1; i++)
if ( a[i] > abs(a[i+1]) )
s+= a[i];
return s;
}
39. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn phần tử xung
quanh trong mảng.
int tong_xungquanh(const int a[], int n)
{
int s=0;
for (int i=0; i<n; i++)
{
if (i==0 && a[i]>a[i+1])
s+= a[i];
else if (i!=0 && a[i]>a[i+1] && a[i] > a[i-1])
s+= a[i];
else if (i==n-1 && a[i] > a[i-1])
s+= a[i];
}
return s;
}
40. Xây dựng giải thuật và viết hàm tính tổng các phần tử cực trị trong mảng.
Phần tử cực trị là phần tử lớn hơn hoặc nhỏ hơn hai phần tử xung quanh.
int tong_cuctri(const int a[], int n)
{
int s=0;
for (int i= 0; i<n; i++)
{
if (i==0 && a[i]!=a[i+1])
s += a[i];
else if (i==n-1 && a[i]!= a[i-1])
s += a[i];
else if ((a[i]<a[i+1] && a[i]<a[i-1]) || (a[i]>a[i+1] && a[i]>a[i-1]) )
s += a[i];
}
return s;
}
41. Xây dựng giải thuật và viết hàm tính tổng các phần tử là số chính phương
trong mảng.
int chinhphuong(int a)
{
for (int i=1; i<=a/2; i++)
if (i*i == a)
return 1;
return 0;
}
int tong_chinh_phuong(const int a[], int n)
{
int s=0;
for (int i= 0; i<n; i++)
if (chinhphuong(a[i])==1)
s+=a[i];
return s;
}
42. Xây dựng giải thuật và viết hàm tính tổng các phần tử là số đối xứng trong
mảng, vd:12321( số gánh ).
int sodoixung(int n)
{
if(n<=100)
return 0;
int donvi, tam = n, sodn = 0;
while(tam!=0)
{
donvi = tam%10;
sodn = sodn*10 + donvi;
tam = tam/10;
}
if (sodn == n)
return 1;
return 0;
}
int tong_dx(const int a[], int n)
{
int s=0;
for (int i= 0; i<n; i++)
if (sodoixung(a[i])==1)
s += a[i];
return s;
}
43. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số đầu là chẵn
trong mảng.
int sodauchan(int n)
{
while(n>=10)
n=n/10;
if (n%2 == 0)
return 1;
return 0;
}
int tong_dau_chan(const int a[], int n)
{
int s=0;
for (int i= 0; i<n; i++)
if (sodauchan(a[i])==1)
{
s += a[i];
}
return s;
}
44. Xây dựng giải thuật và viết hàm tính trung bình cộng các phần tử dương trong
mảng.
float tb_cong_sd(const int a[], int n)
{
int s=0; float dem=0;
for (int i= 0; i<n; i++)
if (a[i]>0)
{
s += a[i];
dem ++;
}
if (dem == 0)
return 0;
return s/dem;
}
45. Xây dựng giải thuật và viết hàm tính trung bình cộng các số nguyên tố trong
mảng.
int songuyento(int n)
{
for(int i=2; i<= n/2; i++)
if (n % i == 0)
return 0;
return 1;
}
float tb_so_ngto(const int a[], int n)
{
int s=0; float dem=0;
for (int i= 0; i<n; i++)
if (songuyento(a[i])==1)
{ s += a[i]; dem ++; }
if (dem == 0)
return 0;
return s/dem;
}
46. Xây dựng giải thuật và viết hàm tính trung bình cộng các phần tử trong mảng
lớn hơn x.
float tb_hon_x(const int a[], int n, int x)
{
int s=0; float dem=0;
for (int i= 0; i<n; i++)
if (a[i]>x)
{
s += a[i]; dem ++;
}
if (dem == 0)
return 0;
return s/dem;
}
47. Xây dựng giải thuật và viết hàm tính khoảng cách trung bình giữacác phần tử
trong mảng.
float kc_tb(const int a[], int n)
{
int s=0; float y=0;
for (int i= 0; i<n-1; i++)
for (int j=i+1; j<n; j++)
{
s = s+ abs(a[i]-a[j]);
y++;
}
return s/y;
}
48. Xây dựng giải thuật và viết hàm đếm số lượng phần tử chẵn có trong mảng
một chiều n số nguyên.
int demsochan(const int a[], int n)
{
int dem = 0;
for (int i=0; i<n; i++)
if (a[i]%2 == 0)
dem ++;
return dem;
}
49. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử dương chia hết cho
7 trong mảng.
int dem_duong_7(const int a[], int n)
{ int dem = 0;
for (int i=0; i<n; i++)
if (a[i]>0 && a[i]%7 == 0)
dem ++;
return dem;
}
50. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử thỏa tính chất số
gánh ( số đối xứng ) trong mảng.
int sodx(int n)
{
if(n<=100)
return 0;
int donvi, tam = n; int sodn = 0;
while(tam!=0)
{
donvi = tam%10;
sodn= sodn*10 + donvi;
tam = tam/10;
}
if (sodn == n)
return 1;
return 0;
}
int dem_dx (const int a[], int n)
{
int dem = 0;
for (int i=0; i<n; i++)
if (sodx (a[i])==1)
dem ++;
return dem;
}
51. Xây dựng giải thuật và viết hàm đếm số lần xuất hiện của giá trị X trong mảng.
int dem_x (const int a[], int n, int x)
{
int dem = 0;
for (int i=0; i<n; i++)
if (a[i] ==x)
dem ++;
return dem;
}
52. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử có chữ số tận cùng
bằng 5 trong mảng.
int dem_cuoi_5 (const int a[], int n)
{
int dem = 0;
for (int i=0; i<n; i++)
if (a[i]%10 == 5)
dem ++;
return dem;
}
53. Xây dựng giải thuật và viết hàm cho biết sự tương quan giữa số lượng chẵn và
lẻ trong mảng, hàm trả về một trong ba giá trị: -1, 0, 1. -1 là lẻ nhiều hơn chẵn;
0 là chẵn bằng lẻ; 1 là chẵn nhiều hơn lẻ.
int sosanh_chanle(const int a[], int n)
{
int demchan = 0;
for (int i=0; i<n; i++)
if (a[i]%2 == 0)
demchan++;
if (demchan > n - demchan)
return -1;
else if (demchan== n - demchan)
return 0;
else
return 1;
}
54. Xây dựng giải thuật và viết hàm đếm phần tử cùng lớn hơn hoặc nhỏ hơn các
phần tử xung quanh trong mảng ( đếm phần tử cực trị ).
int demcuctri(const int a[], int n)
{
int i , tam=0;
for (i=0; i<n; i++)
{
if (i==0 && a[i]!=a[i+1])
tam++;
else if ( i==n-1 && a[i]!=a[i-1])
tam++;
else if ((a[i-1]>a[i] && a[i]<a[i+1]) || (a[i-1]<a[i] && a[i]>a[i+1]))
tam++;
}
return tam;
}
55. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử là số nguyên tố
trong mảng.
int so_ngto(int a)
{
if (a>=2)
{
for (int i=2; i<=a/2; i++)
if (a%i==0)
return 0;
return 1;
}
return 0;
}
int dem_ngto(const int a[], int n)
{
int i, dem=0;
for (i=0; i<n; i++)
if (so_ngto(a[i])==1)
dem++;
return dem;
}
56. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử là số hoàn thiện
trong mảng.
int kt_hoanthien(int n)
{
int tong=0;
for (int i=1 ; i<= n/2; i++)
if(n%i==0)
tong = tong + i;
if (tong == n)
return 1;
return 0;
}
int dem_hoanthien(const int a[], int n)
{
int i=0, dem=0;
for (i=0; i<n; i++)
if (kt_hoanthien(a[i])==1)
dem++;
return dem;
}
57. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử lớn nhất trong
mảng.
int dem_max(const int a[], int n)
{
int i, dem=0; int max = a[0];
for (i=0; i<n; i++)
{
if (max == a[i])
dem++;
else if (max < a[i])
{
max = a[i]; dem = 1;
}
}
return dem;
}
58. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau mà cả hai
đều là chẵn (kề trước hoặc kề sau và chẵn).
int dem_ke_chan(const int a[], int n)
{ int i, dem=0;
for (i=1; i<n; i++)
if (a[i]%2==0 && a[i+1]%2==0 || a[i]%2==0 && a[i-1]%2==0)
dem++;
return dem;
}
59. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau mà cả hai
trái dấu nhau ( kề trước hoặc kề sau và trái dấu).
int dem_traidau(const int a[], int n)
{
int i, dem=0;
for (i=1; i<n; i++)
if (a[i]*a[i+1]<0 || a[i]*a[i-1]<0)
dem++;
return dem;
}
60. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau, mà số
đứng trước cùng dấu với số đứng sau và có giá trị tuyệt đối nhỏ hơn trị tuyệt
đối của số đứng sau.
int dem_cungdau_nho(const int a[], int n)
{ int i, dem=0;
for (i=0; i<n; i++)
if (a[i]*a[i+1]>0 && abs(a[i])<abs(a[i+1]))
dem++;
return dem;
}
61. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử có giá trị phân biệt
trong mảng.
int dem_pb(const int a[], int n)
{
int i, j, dem=0, test;
for (i=0; i<n; i++)
{
for (test=1, j=i+1; j<n; j++)
if (a[i]==a[j])
{
test =0; break;
}
if (test == 1)
dem++;
}
return dem;
}
62. Xây dựng giải thuật và viết hàm liệt kê tần suất xuất hiện của các phần tử
trong mảng, mỗi phần tử liệt kê một lần.
void lietke_lan_xh(const int a[], int n)
{
for (int i=0; i<n; i++)
{
for (int dem=0, j=0; j<n; j++)
if (a[i] == a[j])
{
if (j<i)
break;
else
dem++;
}
if (dem!=0 )
cout<<"n Gia tri "<<a[i]<<" co tan suat xuat hien
la: "<<dem<<endl ;
}
}
63. Xây dựng giải thuật và viết hàm liệt kê các phần tử chỉ xuất hiện đúng một lần
trong mảng.
void lk_mot_lan(const int a[], int n)
{
int c[100]; int dem[100]; int vt = 0;
for (int i=0; i<n; i++)
{
for (int demtam=0, j=0; j<n; j++)
if (a[i] == a[j])
{
if (j<i)
break;
else
demtam++;
}
if (demtam!=0 )
{
c[vt] = a[i]; dem[vt] = demtam;
vt++;
}
}
cout<<"n Gia tri chi xuat hien dung 1 lan:n";
for (int k=0; k<vt; k++)
if (dem[k] == 1)
cout<<setw(3)<<c[k]<<" ";
cout<<endl;
}
64. Xây dựng giải thuật và viết hàm liệt kê các phần tử xuất hiện quá một lần
trong mảng, mỗi phần tử liệt kê một lần.
void lk_hon_motlan(const int a[], int n)
{
int c[100]; int dem[100]; int vt = 0;
for (int i=0; i<n; i++)
{
for (int demtam=0, j=0; j<n; j++)
if (a[i] == a[j])
{
if (j<i)
break;
else
demtam++;
}
if (demtam!=0 )
{ c[vt] = a[i]; dem[vt] = demtam;
vt++; }
}
cout<<"n Gia tri xuat hien qua mot lan:n";
for (int k=0; k<vt; k++)
if (dem[k] != 1)
cout<<c[k]<<" ";
cout<<endl;
}
65. Cho hai mảng a, b. Xây dựng giải thuật và viết hàm đếm số lượng phần tử chỉ
xuất hiện một trong hai mảng.
int dem(const int a[], const int b[], int na, int nb)
{
int i, j, test, dem=0;
for (i=0; i<na; i++)
{
test=1;
for (j=0; j<nb; j++)
if (a[i]==b[j])
{ test = 0; break; }
if (test==1)
dem++;
}
for (i=0;i<nb;i++)
{
test=1;
for (j=0; j<na;j++)
if (b[i]==a[j])
{ test=0;break; }
if (test==1)
dem++;
}
return dem;
}
66. Cho hai mảng a, b. Xây dựng giải thuật và viết hàm cho biết số lần xuất hiện
của mảng a trong mảng b.
int dem_a_trong_b(const int a[],const int b[], int na, int nb)
{
int i, j, h, test, dem=0;
for (i=0; i<nb; i++)
if (b[i]==a[0] && nb-i>=na)
{
h=i;
for (test=1, j=0; j<na; j++,h++)
if (a[j] != b[h])
{ test=0; break; }
if (test==1)
dem++;
}
return dem;
}
67. Xây dựng giải thuật và viết hàm tìm một giá trị có số lần xuất hiện nhiều nhất
trong mảng.
int gt_xh_max(const int a[], int n)
{
int flag[100]={0}, i, j, dem;
for (i=0; i<n ; i++)
if (flag[i]==0)
for (dem=0, j=0; j<n; j++)
if (a[i] == a[j])
flag[j] = dem++;
int xh_max = flag[0], vt=0;
for (i=1; i<n; i++)
if (xh_max < flag[i])
{
xh_max = flag[i];
vt = i;
}
return a[vt];
}
68. Xây dựng giải thuật và viết hàm đếm số lượng phần tử nguyên tố phân biêt
trong mảng.
int kt_ngto(int a)
{
if (a>=2)
{
for (int i=2; i<a; i++)
if (a%i==0)
return 0;
return 1;
}
return 0;
}
int dem_ngto_pb (const int a[], int n)
{
int i, j, test, dem=0;
for (i=0; i<n; i++)
{
if (kt_ngto(a[i])==1)
for (test=1, j=i+1; j<n; j++)
if (a[i] == a[j] )
{ test =0; break; }
if (test == 1)
dem++;
}
return dem;
}
69. Xây dựng giải thuật và viết hàm kiểm tra mảng có phần tử chẵn hay không? có
trả về 1, không có trả
về 0.
int kiemtrachan(const int a[] , int n)
{
int flag = 0; // khong co pt chan
for(int i=0 ; i<n ;i++)
if(a[i]%2 == 0)
{
flag = 1;
return flag;
}
return flag;
}
70. Xây dựng giải thuật và viết hàm kiểm tra mảng có tồn tại hai phần tử kề nhau,
không mang giá trị liêntiếp
int kt_hai_lientiep(const int a[], int n)
{
int flag;
for(int i=0; i<n-1; i++)
{
flag=1; // mang co 2 pt thoa yeu cau
for(int j=i+1; j<n; j++)
{
if( (a[i]+1) ==a[j] || (a[i]-1) == a[j])
{ flag=0; break;}
else
return flag;
}
}
return flag;
}
71. Xây dựng giải thuật và viết hàm kiểm tra mảng có số nguyên tố hay không? có
trả về 1, không có trả
về 0.
int xd_ngto(int a)
{
if (a<=1)
return 0;
for (int i=2; i<a; i++)
if (a%i==0)
return 0;
return 1;
}
int kt_ngto_mang(const int a[] , int n)
{
int flag = 0;
for(int i=0 ; i<n ;i++)
if(xd_ngto(a[i]) == 1)
{
flag = 1;
return flag;
}
return flag;
}
72. Xây dựng giải thuật và viết hàm kiểm tra mảng có thỏa tính chất: không có số
hoàn thiện lớn hơn 256. Thỏa trả về 1, không thỏa trả về 0.
int hoan_thien(int n)
{
int tong=0;
for (int i=1 ; i<n/2; i++)
if(n%i==0)
tong = tong + i;
if (tong == n)
return 1;
return 0;
}
int kt_tinhchat(const int a[] , int n)
{
int flag = 1; // mang thoa tinh chat bai cho
for(int i=0 ; i<n ;i++)
if(hoan_thien(a[i])==1 && a[i] > 256)
{
flag = 0;
return flag;
}
return flag;
}
73. Xây dựng giải thuật và viết hàm kiểm tra mảng có toàn số chẵn hay không? có
trả về 1, không có trả
về 0.
int kt_toanchan(const int a[] , int n)
{
int flag = 1;
for(int i=0 ; i<n ;i++)
if(a[i]%2!=0)
{
flag = 0; return flag;
}
return flag;
}
74. Xây dựng giải thuật và viết hàm kiểm tra mảng có đối xứng không? có trả về 1,
không có trả về 0.
int kt_doixung(const int a[] , int n)
{
int flag = 1;
for(int i=0 ; i<n/2 ; i++)
if(a[i] != a[n-i-1])
{
flag = 0;
return flag;
}
return flag;
}
75. Xây dựng giải thuật và viết hàm kiểm tra mảng có tính chẵn lẻ không? có trả
về 1, không trả về 0. Mảng có tính chẵn lẻ là mảng có tổng hai phần tử liêntiếp
luôn là lẻ.
int kt_tinh_chanle(const int a[] , int n)
{
int flag = 1;
for(int i=0 ; i<n-1 ;i++)
if( (a[i]+a[i+1])%2==0)
{ flag = 0; return flag; }
return flag;
}
76. Xây dựng giải thuật và viết hàm kiểm tra mảng có tăng dần hay không? tăng
trả về 1, không tăng trả
về 0.
int kt_tangdan(const int a[] , int n)
{
int flag = 1;
for(int i=0 ; i<n-1 ; i++)
if(a[i] > a[i+1])
{
flag = 0;
return flag;
}
return flag;
}
77. Xây dựng giải thuật và viết hàm kiểm tra các phần tử trong mảng có lập thành
cấp số cộng hay không? Nếu có chỉ ra công sai d, nếu không trả về 0.
int kt_capsocong(const int a[] , int n , int &d)
{
d = a[1] - a[0]; int flag = 1;
for(int i=2 ; i<n-1 ;i++)
if( (a[i+1] - a[i])!=d)
{
flag = 0; return flag;
}
return flag;
}
78. Xây dựng giải thuật và viết hàm kiểm tra các phần tử trong mảng có bằng
nhau không? bằng nhau trả về 1, không bằng nhau trả về 0.
int kt_bangnhau(const int a[] , int n)
{
int flag;
for(int i = 0 ; i <n-1 ; i++)
{
flag = 0;
for(int j = i+1 ; j<n ; j++)
if(a[i] == a[j])
{ flag = 1; break; }
}
return flag;
}
79. Xây dựng giải thuật và viết hàm kiểm tra mảng có dạng sóng hay không? có
trả về 1, không trả về 0. Một mảng có dạng sóng là mảng có các phần tử thứ i
lớn hơn hoặc nhỏ hơn hai phần tử xung quanh.
int kt_dangsong(const int a[] , int n)
{
int flag = 1;
for(int i = 1 ; i < n-1 ; i++)
if( (a[i-1] > a[i] && a[i] > a[i+1]) || (a[i-1] < a[i] && a[i] < a[i+1]) )
{
flag = 0;
return flag;
}
return flag;
}
80. Hãy cho biết tất cả các phần tử trong mảng a có nằm trong mảng b không? có
trả về 1, không có trả về 0.
int ktA_trong_B(const int a[] ,const int b[] , int n , int m)
{
int flag = 0; int dem = 0;
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j < m ;j++)
if(a[i] == b[j])
{
dem++; break;
}
if(dem == n)
flag = 1;
return flag;
}
81. Xây dựng giải thuật và viết hàm đếm giá trị trong mảng thỏa điều kiện: lớn
hơn tất cả các giá trị đứng trước nó.
int dem_pt_lon_sau(const int a[] , int n)
{
int dem = 0;
for(int i = 1 ; i < n ; i++)
{
int flag = 1;
for(int j = 0; j < i ; j++)
if( a[i] <= a[j] )
{ flag = 0; break; }
if(flag == 1)
dem++;
}
return dem;
}
82. Xây dựng giải thuật và viết hàm sắp xếp mảng một chiều n số nguyên theo thứ
tự tăng dần.
void sx_tang(int a[], int n)
{
int tg, i, j, min;
for(i=0;i<n-1; i++)
{
min=i;
for(j=i+1;j<n; j++)
{
if(a[min]>a[j])
min=j;
}
tg=a[min];
a[min]=a[i]; a[i]=tg;
}
}
83. Xây dựng giải thuật và viết hàm sắp xếp phần tử lẻ tăng dần, các phần tử khác
giữ nguyên vị trí.
+ Yêu cầu: Sắp xếp các phần tử lẻ theo thứ tự tăng dần các phần tử khác giữ nguyên vị
void sx_le_tang(int a[],int n)
{
for (int i=0; i<n-1; i++)
if (a[i]%2!=0)
for (int j=i+1; j<n; j++)
if (a[j]%2!=0 && a[i]>a[j])
{
int tg=a[i];
a[i] = a[j];
a[j]=tg;
}
}
84. Xây dựng giải thuật và viết hàm sắp xếp số nguyên tố tăng dần, các phần tử
khác giữ nguyên vị trí.
int SoNguyenTo(int a)
{
if (a<=1)
return 0;
for (int i=2; i<=a/2; i++)
if (a%i==0)
return 0;
return 1;
}
void sx_ngto_tang(int a[],int n)
{
for (int i=0; i<n-1; i++)
if (SoNguyenTo (a[i] ) ==1)
for (int j=i+1; j<n; j++)
if (SoNguyenTo (a[j] ) ==1 && a[i]>a[j])
{
int tg=a[i];
a[i] = a[j];
a[j]=tg;
}
}
85. Xây dựng giải thuật và viết hàm sắp xếp số hoàn thiện giảm dần, các phần tử
khác giữ nguyên vị trí.
int so_hoanthien(int n)
{
int tong=0;
for (int i=1; i<=n/2; i++)
if(n%i==0)
tong = tong + i;
if (tong == n)
return 1;
return 0;
}
void sx_hoanthien_giam(int a[],int n)
{
for (int i=0; i<n-1; i++)
if (so_hoanthien (a[i] ) ==1)
for (int j=i+1;j<n;j++)
if (so_hoanthien (a[j] ) ==1 && a[i]<a[j])
{
int temp=a[i];
a[i] = a[j];
a[j]=temp;
}
}
86. Cho hai mảng a, b. Xây dựng giải thuật và viết hàm cho biết mảng b có phải là
hoán vị của mảng a hay không.
void sapxep(int a[],int n)
{
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
if (a[i]>a[j])
{
int temp=a[i];
a[i] = a[j]; a[j]=temp;
}
}
void KetQua(int a[],int b[],int na,int nb)
{
if (na != nb)
{
cout<<"n mang b ko phai là hoan vi cua mang a!"<<endl;
return ;
}
sapxep(a, na);
sapxep(b, nb);
for (int i=0; i<na; i++)
if (a[i]!=b[i])
{
cout<<"n mang b ko phai la hoan vi cua mang a!"<<endl;
return;
}
cout<<"n mang b la hoan vi cua mang a!"<<endl;
return;
}
87. Xây dựng giải thuật và viết hàm sắp xếp các số dương tăng dần, các số âm giữ
nguyên vị trí.
void sx_duong_tang(int a[],int n)
{
for (int i=0; i<n-1; i++)
if (a[i]>0)
for (int j=i+1; j<n; j++)
if (a[j]>0 && a[i]>a[j])
{
int temp=a[i];
a[i] = a[j]; a[j]=temp;
}
}
88. Xây dựng giải thuật và viết hàm sắp xếp chẵn, lẻ tăng dần nhưng giữ vị trí
tương đối giữa các phần tử chẵn và lẻ.
void sx_chanle_tang( int a[],int n )
{
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
if (( (a[i]%2==0 && a[j]%2==0) ||(a[i]%2!=0 && a[j]%2!=0)) && a[i]>a[j])
{ int tg=a[i]; a[i] = a[j];
a[j]=tg; }
}
89. Xây dựng giải thuật và viết hàm sắp xếp số dương tăng dần, số âm giảm dần, vị
trí tương đối không thay đổi.
void sx_duongtang_amgiam(int a[], int n)
{
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
{
if (a[i]>0 && a[j]>0 && a[i]>a[j])
{ int tg=a[i]; a[i] = a[j];
a[j]=tg; }
else if (a[i]<0 && a[j]<0 && a[i]<a[j])
{
int tg=a[i]; a[i] = a[j];
a[j]=tg;
}
}
}
90. Cho hai mảng a, b. Xây dựng giải thuật và viết hàm trộn hai mảng thành một
mảng giảm dần.
void tron_mang_giam(int a[], int b[], int c[], int na, int nb, int &nc)
{
sapxep(a,na); //Sap xep tang mang A
sapxep(b,nb); //Sap xep tang mang B; hàm sapxep ở đầu kỹ thuật sx.
nc = na + nb;
int vta= na-1,vtb= nb-1;
for (int i=0; i<nc; i++)
{
if (vta >=0&& vtb >= 0)
{
if (a[vta] > b[vtb])
{ c[i] = a[vta]; vta--; }
else
{
c[i] = b[vtb]; vtb--; }
}
else if (vtb < 0)
{
c[i] = a[vta]; vta--; }
else
{
c[i] = b[vtb]; vtb--;
}
}
}
91. Xây dựng giải thuật và viết hàm thêm một phần tử x vào vị trí k trong mảng
một chiều n số nguyên.
void them_gt_x(int a[], int &n, int x, int k)
{
if( k>=n)
{
a[n]=x; n++;
return;
}
for (int i=n; i>k; i--)
a[i] = a[i-1];
a[k] = x; n++;
}
92. Xây dựng giải thuật và viết hàm thêm phần tử x vào trong mảng tăng nhưng
vẫn giữ nguyên tính tăng của mảng.
void them_x_mangtang(int a[], int &n, int x)
{
int dem=0;
for (int i=0; i<n;i++)
if (a[i]>x)
{
dem=1;
for (int k = n; k>i; k--)
a[k] = a[k-1];
a[i] = x;
break;
}
if(dem==0)
a[n]=x;
n++;
}
93. Xây dựng giải thuật và viết hàm thêm phần tử x vào sau phần tử là số nguyên
tố đầu tiêntrong mảng, nếu không có phần tử nguyên tố thì thêm vào cuối
mảng.
int kt_ngto(int a)
{
if (a<=1)
return 0;
for (int i=2; i<=a/2; i++)
if (a%i==0)
return 0;
return 1;
}
void them_x_sau_ngto(int a[], int &n, int x)
{
int dem=0;
for (int i=0; i<n; i++)
if (kt_ngto(a[i])==1)
{
dem++; i=i+1;
for (int k = n; k>i; k--)
a[k] = a[k-1];
a[i] = x;
break;
}
if(dem==0)
a[n]=x;
n++;
}
94. Xây dựng giải thuật và viết hàm xóa phần tử có chỉ số k trong mảng một chiều
n số nguyên.
void xoa_pt_k(int a[], int &n, int k)
{
for(int i=k; i<n;i++)
a[i] = a[i+1];
n--;
}
95. Hãy xóa tất cả các phần tử lớn nhất trong mảng.
int tim_max(int a[], int n)
{ int max = a[0];
for (int i=1; i<n ; i++)
{ max=(max<a[i])?a[i]:max; }
return max;
}
void xoa_pts_max(int a[], int &n)
{
int max=tim_max(a,n);
for (int i=0; i<n; i++)
if (a[i]==max)
{ for (int k=i; k<n; k++)
a[k] = a[k+1];
n--;
}
}
96. Xây dựng giải thuật và viết hàm xóa tất cả các số chẵn trong mảng.
void xoa_pts_chan(int a[], int &n)
{
for (int i=0; i<n; i++)
if (a[i]%2==0)
{
for (int k=i; k<n; k++)
a[k] = a[k+1];
n--;
}
}
97. Xây dựng giải thuật và viết hàm xóa tất cả các số chính phương trong mảng.
int so_chinhphuong(int n)
{
for (int i=1; i<=n/2; i++)
if (i*i == n)
return 1;
return 0;
}
void xoa_pts_cp(int a[], int &n)
{
for (int i=0; i<n; i++)
if (so_chinhphuong(a[i])==1)
{
for (int k=i; k<n; k++)
a[k] = a[k+1];
n--;
}
}
98. Xây dựng giải thuật và viết hàm xóa tất cả các số trùng với x trong mảng.
void xoa_pts_x(int a[], int &n, int x)
{
for (int i=0; i<n; i++)
if (a[i]==x)
{
for (int k=i; k<n; k++)
a[k] = a[k+1];
n--;
}
}
99. Xây dựng giải thuật và viết hàm xóa tất cả các số nguyên tố trong mảng.
int so_nguyento(int n)
{
if(n>=2)
{
for (int i=2; i<=n/2; i++)
if (n%i==0)
return 0;
return 1;
}
return 0;
}
void xoa_ngto(int a[], int &n)
{
for(int i=0; i<n; i++)
if (so_nguyento(a[i])==1)
{
for (int k=i; k<n; k++)
a[k]=a[k+1];
n--;
}
}
100. Xây dựng giải thuật và viết hàm xóa tất cả các phần tử trùng nhau trong mảng
và chỉ giữ lại duy nhất một phần tử.
void xoa_pts_trung(int a[], int &n)
{
for (int i=0; i<n-1; i++)
for(int j=i+1; j<n; j++)
if (a[i]==a[j])
{
for (int k=j; k<n; k++)
a[k]=a[k+1];
n--;
}
}
101. Xây dựng giải thuật và viết hàm xóa tất cả các phần tử xuất hiện nhiều hơn
một lần trong mảng.
void xoa_pts_hon1(int a[], int &n)
{
for (int i=0; i<n-1; i++)
{
for(int test = 0, j=i+1; j<n; j++) //xóa ptu tai j
if (a[i]==a[j])
{
for (int k=j; k<n; k++)
a[k] = a[k+1];
n--; j--; test=1;
}
if (test == 1) //Xóa luôn chính nó
{
for (int k=i; k<n; k++)
a[k] = a[k+1];
n--; i--;
}
}
}
102. Xây dựng giải thuật và viết hàm đưa số 1 về đầu mảng.
void duaMotvedau(int a[], int n)
{
for (int i=1; i<n; i++)
if (a[i] == 1)
{
int tg=a[i];
for(int k=i ; k>0; k--)
a[k] = a[k-1];
a[0] = tg;
}
}
103. Xây dựng giải thuật và viết hàm đưa chẵn về đầu, lẻ về cuối, phần tử 0 nằm
giữa mảng.
void sx_chandau_0_lecuoi(int a[], int n)
{
int i; int vtle=0;
for (i=1; i<n; i++)
if (a[i] %2 == 0 && a[i]!=0 || a[0]==0)
{
int tg=a[i];
for(int k=i ; k>0; k--)
a[k] = a[k-1];
a[0] = tg;
}
int dem=0;
for (i=0; i<n; i++)
{
if (dem==0 && a[i]%2!=0)
{
vtle = i;
dem=1;
}
if(a[i]==0 && vtle==0)
continue;
else if (a[i]==0)
{
for(int k=i ; k>vtle; k--)
a[k] = a[k-1];
a[vtle] =0;
}
}
}
104. Xây dựng giải thuật và viết hàm đưa các số chia hết cho 3 về đầu mảng.
void chiahetchoba(int a[], int n)
{
for (int i=1; i<n; i++)
if (a[i] %3 == 0)
{
int tg = a[i];
for(int k = i ; k>0; k--)
a[k] = a[k-1];
a[0] = tg;
}
}
105. Xây dựng giải thuật và viết hàm đảo ngược mảng ban đầu.
void dao_nguoc(int a[], int n)
{
for (int i=0, j=n-1; i<j; i++, j--)
{ int tg=a[i]; a[i]=a[j]; a[j]=tg; }
}
106. Xây dựng giải thuật và viết hàm đảo ngược thứ tự các số chẵn trong mảng.
void daochan(int a[], int n)
{
for (int i=0; i<n-1; i++)
for (int j = i+1; j<n; j++)
if (a[j]%2==0 &&a[i] %2 == 0)
{
int tg=a[i]; a[i]=a[j];
a[j]=tg;
}
}
107. Xây dựng giải thuật và viết hàm dịch trái các phần tử trong mảng.
void dichtrai(int a[], int n)
{
int tg = a[0];
for (int i=0; i<n-1; i++)
a[i]=a[i+1];
a[n-1]= tg;
}
108. Xây dựng giải thuật và viết hàm xuất mảng: chẵn nằm 1 hàng, lẻ nằm hàng
tiếptheo.
void chanle_haihang(const int a[], int n)
{
cout<<"n Cac pt chan: " ;
for (int i=0; i<n; i++)
if (a[i]%2==0)
{
cout<<setw(3)<<a[i];
}
cout<<"n Cac pt le: ";
for (i=0; i<n; i++)
if (a[i]%2!=0)
{
cout<<setw(3)<<a[i];
}
}
109. Xây dựng giải thuật và viết hàm đảo thứ tự số chẵn, lẻ trong mảng nhưng vẫn
giữ vị trí tương đối.
void hoanvi(int &a, int &b)
{
int temp = a; a = b;
b = temp;
}
void daonguoc_chanle(int a[], int n)
{
int i, j;
for (i=0; i<n-1; i++)
for(j=i+1;j<n; j++)
{
if (a[i]%2==0 && a[j]%2 == 0)
hoanvi(a[i],a[j]);
else if (a[i]%2!=0 && a[j]%2!=0)
hoanvi(a[i],a[j]);
}
}
110. Xây dựng giải thuật và viết hàm biến đổi mảng bằng cách thay giá trị max =
giá trị minvà ngược lại.
void minmax(int a[], int n, int &max, int &min)
{
max= min= a[0];
for (int i=1; i<n; i++)
{
max=(max<a[i])?a[i]:max;
min=(min>a[i])?a[i]:min;
}
}
void biendoi(int a[], int n)
{
int max,min;
minmax(a, n, max, min);
for(int i=0; i<n; i++)
{
if (a[i]==max)
a[i]=min;
else if (a[i]==min)
a[i]=max;
}
}
111. Xây dựng giải thuật và viết hàm liệt kê tất cả các mảng con có độ dài hơn 2
phần tử.
void xuatmangcon(const int b[], int nb)
{
for(int i=0; i<nb; i++)
cout<<setw(4)<<b[i];
cout<<endl;
}
void lk_mang_hon2(const int a[], int n)
{
int b[100], nb, d;
for (int i=0; i<n-1; i++)
for (d = i+3; d<=n; d++)
{
nb=0; b[0]=a[i]; nb++;
for(int j=i+1; j<d; j++)
{
b[nb]=a[j];
nb++;
}
xuatmangcon(b,nb); cout<<endl;
while(nb>3)
{
for(int m=1; m<nb; m++)
b[m]=b[m+1];
nb--;
xuatmangcon(b,nb); cout<<endl;
}
}
}
112. Xây dựng giải thuật và viết hàm liệt kê tất cả các mảng con tăng dần trong
mảng.
void lk_mangcon_tang(const int a[], int n)
{
int b[100], nb, d;
for (int i=0; i<n-1; i++)
for (d = i+2; d<=n; d++)
{
nb=0; b[0]=a[i]; nb++; int co=0;
for(int j=i+1; j<d; j++)
{
if(a[j]>b[nb-1])
{ co=1; b[nb]=a[j]; nb++; }
else if(nb!=1 && a[j]<b[0])
co=0;
else if(nb!=1 && a[j]<b[nb-1] && a[j]>b[0])
{
co=1;
for(int k=1; k<nb; k++)
if(b[k]>a[j])
{
b[k]=a[j]; break;
}
while(nb>k+1)
nb--;
}
}
if(co!=0)
{
xuatmangcon(b,nb); cout<<endl;
while(nb>2)
{
for(int m=1; m<nb; m++)
b[m]=b[m+1];
nb--;
xuatmangcon(b,nb); cout<<endl;
}
}
}
}
113. Xây dựng giải thuật và viết hàm liệt kê tất cả mảng con tăng và có chứa giá trị
lớn nhất trong mảng.
void lk_mangcon_tangmax(const int a[], int n)
{ int b[100], nb, d, max=a[0];
for(int k=1; k<n; k++)
max=(a[k]>max)?a[k]:max;
for (int i=0; i<n-1; i++)
for (d = i+2; d<=n; d++)
{
nb=0; b[0]=a[i]; nb++; int co=0;
for(int j=i+1; j<d; j++)
{
if(a[j]>b[nb-1])
{ co=1; b[nb]=a[j]; nb++; }
else if(nb!=1 && a[j]<b[0])
co=0;
else if(nb!=1 && a[j]<b[nb-1] && a[j]>b[0])
{
co=1;
for(int k=1; k<nb; k++)
if(b[k]>a[j])
{ b[k]=a[j]; break; }
while(nb>k+1)
nb--;
}
}
if(co!=0)
{
for(int m=0; m<nb; m++)
if(b[m]==max)
{ xuatmangcon(b,nb); break; }
if(kt_tang(b,nb)==1 &&nb>2)
while(nb>2)
{
for(int m=1; m<nb; m++)
b[m]=b[m+1];
nb--;
for(int n=0; n<nb; n++)
if(b[n]==max)
{ xuatmangcon(b,nb); break; }
}
}
}
}
114. Xây dựng giải thuật và viết hàm liêt kê tất cả mảng con tăng và tính tổng cho
từng mảng con đó.
int tongs(const int b[],int nb)
{
long s=0;
for(int i=0; i<nb; i++)
s+=b[i];
return s;
}
void lk_mangcon_tang_tong(const int a[], int n)
{
int b[100], nb, d;
for (int i=0; i<n-1; i++)
for (d = i+2; d<=n; d++)
{
nb=0; b[0]=a[i]; nb++; int co=0;
for(int j=i+1; j<d; j++)
{
if(a[j]>b[nb-1])
{ co=1; b[nb]=a[j]; nb++; }
else if(nb!=1 && a[j]<b[0])
co=0;
else if(nb!=1 && a[j]<b[nb-1] && a[j]>b[0])
{
co=1;
for(int k=1; k<nb; k++)
if(b[k]>a[j])
{ b[k]=a[j]; break; }
while(nb>k+1)
nb--;
}
}
if(co!=0)
{
xuatmangcon(b,nb);
int s=tongs(b,nb);
cout<<"tt co tong la: "<<s<<endl;
while(nb>2)
{
for(int m=1; m<nb; m++)
b[m]=b[m+1];
nb--;
xuatmangcon(b,nb);
int s=tongs(b,nb);
cout<<"tt co tong la: "<<s<<endl;
}
}
}
}
115. Xây dựng giải thuật và viết hàm đếm số mảng con tăng trong mảng ban đầu.
int dem_mangcon_tang(const int a[], int n)
{
int b[100], nb, d, dem=0;
for (int i=0; i<n-1; i++)
for (d = i+2; d<=n; d++)
{
nb=0; b[0]=a[i]; nb++; int co=0;
for(int j=i+1; j<d; j++)
{
if(a[j]>b[nb-1])
{ co=1; b[nb]=a[j]; nb++; }
else if(nb!=1 && a[j]<b[0])
co=0;
else if(nb!=1 && a[j]<b[nb-1] && a[j]>b[0])
{
co=1;
for(int k=1; k<nb; k++)
if(b[k]>a[j])
{
b[k]=a[j]; break;
}
while(nb>k+1)
nb--;
}
}
if(co!=0)
{
dem++;
while(nb>2)
{
for(int m=1; m<nb; m++)
b[m]=b[m+1];
nb--; dem++;
}
}
}
return dem;
}
116. Xây dựng giải thuật và viết hàm liệt kê tất cả mảng con toàn dương và có độ
dài hơn 1.
void lk_mangduong_hon1(const int a[], int n)
{
int b[100], nb, d;
for (int i=0; i<n-1; i++)
for (d = i+2; d<=n; d++)
{
int co=0;
if(a[i]>0)
{
nb=0; b[0]=a[i];
nb++;
for(int j=i+1; j<d; j++)
{
if(a[j]>0)
{
co=1;
b[nb]=a[j]; nb++;
}
else if(a[j]<0)
co=0;
}
}
if(co!=0)
{
xuatmangcon(b,nb); cout<<endl;
while(nb>2)
{
for(int m=1; m<nb; m++)
b[m]=b[m+1];
nb--;
xuatmangcon(b,nb); cout<<endl;
}
}
}
}
117. Xây dựng giải thuật và viết hàm tìm mảng con toàn dương có tổng lớn nhất.
void mangduong_smax(const int a[], int n)
{
int b[100], nb, d; int max=0, s;
for (int i=0; i<n-1; i++)
for (d = i+2; d<=n; d++)
{
int co=0;
if(a[i]>0)
{
nb=0; b[0]=a[i]; nb++;
for(int j=i+1; j<d; j++)
{
if(a[j]>0)
{
co=1;
b[nb]=a[j]; nb++;
}
else if(a[j]<0)
co=0;
}
}
if(co!=0)
{
int c[100], nc;
s=tongs(b,nb);
if(max<s)
{
max=s; nc=0;
for(int k=0; k<nb; k++)
{ c[nc]=b[k]; nc++; }
}
else
{
xuatmangcon(c,nc); cout<<endl; return;
}
}
}
}
II: DANH SÁCH LIÊN KẾT ĐƠN
118. Cấu trúc dữ liệu
Cấu trúc phần tử
typedef struct tag_Node
{
int data;
struct tag_Node *pNext;
} Node;
Cấu trúc danh sách các phần tử
typedef struct tag_List
{
Node*pHead;
Node*pTail;
}List;
119. Xây dựng giải thuật và viết hàm xóa phần tử đầu
int xoadau(List &l)
{
if ( l.pHead= =NULL)
return 0;
else
{
l.pHead=l.pHead->pNext;
return 3;
}
}
120. Xây dựng giải thuật và viết hàm xóa phần tử cuối
int xoa cuoi(List &l)
{
Node *k;
If(l.pTail= =NULL)
Return 0;
Else
{
For(k=l.pHead;k->pNext!=pTail)
K=k->pNext;
k->pNext=NULL;
l.pTail=k;
return 3;
}
}
121. Xây dựng giải thuật và viết hàm xóa một phần tử đứng sau một phần tử x:
Int xoa ptx(List &l,int x)
{
Node *p=tim x(l,x);
If(l.pHead= =NULL)
Return 0;
If(p= =NULL)
Return 1;
If(p= =l.pTail)
{
Return 2;
}
Else
{
Node *k=p->pNext;
Node *m=->pNext;
p->pNext=m;
}
}
122. Xây dựng giải thuật và viết hàm xóa một phần tử đứng trước một phần tử x:
Int xoapt_truoc x(List &l,int x)
{
Node *p=tim x(l,x);
If(l.pHead= =NULL)
Return 0;
If(p= =NULL)
Return 1;
If(p= =l.pHead)
Return 2;
If(l.pHead->pNext= =p)
{
Xoadau(l);
Return 3;
}
Else
{
Node *k=l.pHead;
While(q->pNext!=k)
q=q->pNext;
q->pNext=p;
return 4;
}
}
123. Xây dựng giải thuật và viết hàm xóa toàn bộ danh sách:
Void xoa_toanbods(List &L)
{
Node* Temp = L.First;
while (Temp!= NULL){
L.First = L.First ->Next;
Temp ->Next = NULL;
if (L.First != NULL)
L.First ->Pre = NULL;
delete Temp;
Temp=L.First;
}
}
124. Xây dựng giải thuật và viết hàm xóa một phần tử x:
int xoapt_Node (List &l, int x)
{
Node *p = l.pHead;
while (p != NULL)
{
if (p->data== x) break;
p = p->pNext;
}
125. Xây dựng giải thuật và viết hàm xóa phần tử nhỏ nhất trong danh sách:
126. Xây dựng giải thuật và viết hàm xóa hai phần tử trước và sau X:
127. Xây dựng giải thuật và viết hàm liệt kê các số âm trong danh sách:
void List_ke_so_am(List &l)
{
Node *p=l.pHead;int dem=0;
while(p!=NULL)
{
if(p->data<0)
{
cout<<p->data<<" ";
dem++;
}
p=p->pNext;
}
if(dem==0)
cout<<"danh sach khong co so am";
}
128. Xây dựng giải thuật và viết hàm tìm phần tử có giá trị max trong danh sách:
Node *timmax(List l)
{
Node *p=l.pHead;
for(Node *k=l.pHead->pNext,k,k=k->pNext)
{
if(k->data<p->data)
p=k;
}
cout<<"n gia tri max="<<p->data;
cout<<"n ";
return p;
return NULL;
}
129. Xây dựng giải thuật và viết hàm tìm phần tử có giá trị mintrong danh sách:
Node *timmin(List l)
{
Node *p=l.pHead;
for(Node *k=l.pHead->pNext,k;k=k->pNext)
{
if(k->data<p->data)
k=p;
}
cout<<"n gia tri min="<<p->data;
cout<<"n ";
return p;
return NULL;
}
130. Xây dựng giải thuật và viết hàm tìm phần tử chẵn đầu trong danh sách:
Node *tim_chan_dau(List l)
{
Node *p=l.pHead;
while(p!=NULL)
{
if(p->data%2==0)
{
return p;
break;
}
p=p->pNext;
}
return NULL;
}
131. Xây dựng giải thuật và viết hàm tìm phần tử lẽ cuối cùng trong danh sách:
Node *tim_le_cuoi(List l)
{
Node *p=l.pHead;Node *k=NULL;
while(p!=NULL)
{
if(p->data%2!=0)
{
k=p;
}
p=p->pNext;
}
if(k!=NULL)
return k;
else
return NULL;
}
132. Xây dựng giải thuật và viết hàm tìm phần tử chẵn max lớn hơn lẽ max:
void chanmax_max_minmax(LIST &l)
{
Node *cm = chanmax(l);
Node *lm = lemax(l);
if(cm->data < lm->data)
cout<<"Khong thoa y/c! So chan lon nhat la: "<<cm->data<<" nho hon so le
lon nhat la: "<<lm->data;
if(cm->data > lm->data)
cout<<"Thoa y/c! So chan lon nhat la: "<<cm->data<<" va so le lon nhat la:
"<<lm->data;
else if(cm->data == lm->data)
cout<<"Khong thoa y/c! So chan lon nhat: "<<cm->data<<" bang so le lon
nhat: "<<lm->data;
}
133. Xây dựng giải thuật và viết hàm đếm nguyên tố trong danh sách
int dem_so_nto(List l)
{
Node *k=l.pHead;
int dem=0;
for(k;k!=NULL;k=k->pNext)
{
if(ktsnt(k->data)==1)
cout<<k->data<<" ";
}
}
134. Xây dựng giải thuật và viết hàm đếm số node
int demsoNode(List l)
{
int dem=0;
Node *p=l.pHead;
While(q!=NULL)
{
Dem++;
q=q->pNext;
}
Return dem;
}
135. Xây dựng giải thuật và viết hàm đếm số phần tử chẵn:
int demchan(List l)
{
int dem=0;
Node *p;
p=l.pHead;
while(p)
{
if(p->data%2= = 0)
dem++;
p=p->pNext;
}
return dem;
}
136. Xây dựng giải thuật và viết hàm đếm phần tử lẻ:
Int demle(List l)
{
Int dem=0;
Node *p;
P=l.pHead;
While(p)
{
If(p->data%2!=0)
Dem++;
p=p->pNext;
}
Return dem;
}
137. Xây dựng giải thuật và viết hàm đếm số phần tử chia hết cho 2:
Int ptu_chia2(list l)
{
int dem=0;
Node *p;
p=l.pHead;
while(p)
{
if(p->data%2= =0)
dem++;
p=p->pNext;
}
return dem;
}
138. Xây dựng giải thuật và viết hàm đếm số phần tử dương:
int demduong(List l)
{
int dem=0;
Node *p;
p=l,pHead;
while(p)
{
if(p->data>0)
dem++;
p=p->pNext;
}
return dem;
}
139. Xây dựng giải thuật và viết hàm tìm các số chắn trong danh sách
int kt_chan(int k)
{
int flag=0;
if(k%2= =0)
flag=1;
return flag;
}
140. Xây dựng giải thuật và viết hàm in ra các số chẵn
void xuatchan(List l)
{
int flag=0;
Node *;
p=l.pHead;
while(p)
{
if(kt_chan(p->data)= =1)
{
cout<<” “<<p->data;
flag=1;
}
p=p->pNext;
}
if(flag= = 0)
cout<<”n khong co so chan nao trong danh sach “;
}
141. Xây dựng giải thuật và viết hàm tìm các số lẽ trong danh sách
int kt_le(int k)
{
int flag=0;
if(k%2!=0)
flag=1;
return flag;
}
142. Xây dựng giải thuật và viết hàm in ra các số lẽ
void xuatle(List l)
{
int flag=0;
Node *p;
p=l.pHead;
while(p)
{
if(kt_le(p->data)= = 1)
{
cout<<” “<<p->data;
flag=1;
}
p=p->pNext;
}
if(flag= =0)
cout<<”n khong co so le nao trong danh sach “;
}
143. Xây dựng giải thuật và viết hàm tìm các số nguyên tố trong danh sách:
int KT_NgTo(int k)
{
int dem=0;
for(int i=2;i<=k;i++)
if(k%i==0)
dem++;
return dem;
}
144. Xây dựng giải thuật và viết hàm in ra các số nguyên tố
void XuatNgTo(List l)
{
int flag=0;
Node *p;
p=l.pHead;
while(p)
{
if(KT_NgTo(p->data)==1)
{
cout<<" "<<p->data;
flag=1;
}
p=p->pNext;
}
if(flag==0)
cout<<"n Khong co so nguyen to nao trong danh sach";
}
145. Xây dựng giải thuật và viết hàm tìm các số chia hết cho 2:
int KT_ChiaHet2(int k)
{
int flag=0;
if(k%2==0)
flag=1;
return flag;
}
146. Xây dựng giải thuật và viết hàm in ra các số chẵn
void XuatChiaHet2(List l)
{
int flag=0;
Node *p;
p=l.pHead;
while(p)
{
if(KT_ChiaHet2(p->data)==1)
{
cout<<" "<<p->data;
flag=1;
}
p=p->pNext;
}
if(flag==0)
cout<<"n Khong co so nao chia het cho 2 trong danh sach";
}
147. Xây dựng giải thuật và viết hàm đổi chổ trực tiếp –Interchange Sort:
void inter_sort(List l)
{
for(Node *p=l.pHead,p!=l.pTail,p=p->pNext)
{
for(Node *k=p->pNext,k,k=k->pNext)
{
if(p->data,k->data);
}
}
}
148. Xây dựng giải thuật và viết hàm sắp xếp “chọn trực tiếp –SelectionSort”
void selection_sort(List l)
{
for(Node*p=l.pHead;p!=l.pTail;p=p->pNext)
{
Node*k=p;
for(Node *q=p->pNext;q;q=q->pNext)
{
if (k->data>q->data)
k=q;
}
hoanvi(k->data,p->data);
}
}
149. Xây dựng giải thuật và viết hàm sắp xếp “chèn trực tiêp –InsertionSort”
void insertion_sort(List l)
{
for(Node *p=l.pHead->pNext;p;p=pNext)
{
Node *pos=l.pHead;
while(pos!=p)
{
if(pos->data>p->data)
hoanvi(pos->data,p->data);
pos=pos->pNext;
}
}
}
}
150. Xây dựng giải thuật và viết hàm sắp xếp “dựa trên phân hoạch- Quick Sort”
void quick_sort(List &l)
{
List l1;List l2;
if (l.pHead==NULL)
return ;
else
khoitao(l1);
khoitao(l2);
Node *x=l.pHead;
l.pHead=p->pNext;
while(l.pHead!=NULL)
{
Node *p=l.pHead;
l.pHead=p->pNext;
p->pNext=NULL;
if(p->data<=x->data)
themdau2(l1,p);
else
themdau2(l2,p);
}
quick_sort(l1);
quick_sort(l2);
if(l1.pHead==NULL)
l.pHead=x;
else
{
l.pHead=l1.pHead;
l1.pTail->pNext=x;
}
x->pNext=l2.pHead;
if(l2.pHead==NULL)
l.pTail=x;
else
{
l.pTail=l2.pTail;
}
}
151. Xây dựng giải thuật và viết hàm sắp xếp “nổi bọt –Buble”
void bubble(List l)
{
Node *cuoi=l.pTail,*tcuoi;
for(Node *dau=l.pHead;dau;
dau=dau->pNext;
{
while(cuoi!=l.pHead)
{
tcuoi=dau->pNext;
if(cuoi->data<tcuoi->data)
hoanvi(cuoi->data,tcuoi->data);
cuoi=tcuoi;
}
}
}
152. Xây dựng giải thuật và viết hàm thêm vào đầu danh sách
void themdau(List &l);
{//khoitao(l);
int x;
cout<<"n nhap x=";
cin>>x;
Node *p=tao_nut(*);
if(l.pHead==NULL)
l.pHead=l.pTail=p;
else
{
p->pNext=pHead;
l.pHead=p;
}
}
153. Xây dựng giải thuật và viết hàm thêm vào cuối danh sách
void themcuoi(List &l);
{//khoitao(l);
int x;
cout<<"n nhap x";
cin>>x;
Node *p=tao_nut(x);
if (l.pHead=l.pTail=p;
l.pHead=l.pTail=p;
else
{
l.pTail->pNext=p;
l.pTail=p;
}
}
154. Xây dựng giải thuật và viết hàm thêm vào danh sách sau một phần tử x
int them_sau_y_ptx(List &l,int x,int y)
{
Node *p=tao_nut(y);
Node *q=tim x(l,x);
if (l.pHead==NULL)
return 0;
if (q==NULL)
return 1;
if(q==k.pTail)
themcuoi(l);
else
{
p->pNext=q->pNext;
q->pNext=p;
return 3;
}
155. Xây dựng giải thuật và viết hàm thêm vào danh sách trước một phần tử x
int them_truoc_y_ptx(List &l,int x,int y)
{
Node *p=tao_nut(y);
Node *q=timx(l,x);
if(l.pHead==NULL)
return 0;
else
{
if(q==NULL)
return 1;
if(q==l.pHead)
themdau(l);
else
{
Node*k=l.pHead;
while(k->pNext!=q)
k=k->pNext;
p->pNext=q;
k->pNext=p;
return 3;
}
}
}
156. Xây dựng giải thuật và viết hàm thêm phần tử x trước chẵn đầu
void themx_truoc_chan_dau(List &l)
{
Node *p;int y;
if(tim_chan_dau(l)==NULL)
themdau(l);
else
{
cout<<" nhap ptu y can them truoc chan dau"<<tim_chan_dau(l)->data<<" ";
cin>> y;
them_truoc_y_ptx(l,tim_chan_dau(l)->data,y);
}
}
157. Xây dựng giải thuật và viết hàm thêm phần tử x sau lẽ cuối
void themx_sau_le_cuoi(List &l)
{
Node *p;int y;
if(tim_le_cuoi(l)==NULL)
themcuoi(l);
else
{
cout<<" nhap ptu y can them sau le cuoi"<<tim_le_cuoi(l)->data<<" ";
cin>> y;
them_sau_y_ptx(l,tim_le_cuoi(l)->data,y);
}
}
158. Xây dựng giải thuật và viết hàm tạo một danh sách liênkết:
void tao_ds(List &l)
{
int x,Node *p;
do{
cout<<"n nhap x=";
cin>> x;
if(x==-1)
break;
p=tao_nut(x);
if (l.pHead==NULL);
l.pHead=l.pTail=p;
else
{
l.pTail->pNext=p;
l.pTail=p;
}
}while(1);
}
159. Xây dựng giải thuật và viết hàm in số nguyên tố trong danh sách
void in_so_nto(List l)
{
Node *k=l.pHead;
for(k;k!=NULL;k=k->pNext)
{
if(ktsnt(k->data)==1)
cout<<k->data<<" ";
}
}
160. Xây dựng giải thuật và viết hàm xuất các số nguyên trong danh sách
Void xuat_songuyen(List l)
{
For(Node *p=l.pHead;p!=NULL;p=p->pNext)
{
Cout<< pi->data<<” “;
}
}
161. Xây dựng giải thuật và viết hàm xuất phần tử âm đầu tiên trong danh sách
Void xuat_pt_am_dau tien(List l, int n)
{
Node *p=l.pHead;int dem=0;
{
Cout<<”n nhap pt n=:”;
Cin>> n;
}
While(p!=NULL)
{
If(p->data<0)
{
Cout<<”n phan tu am dau tien=”;
Dem++;
}
}
If(dem= =0)
Cout<<” khong tim thay”;
}
162. Xây dựng giải thuật và viết hàm tạo danh sách random có sắp xếp
Void tao_ds_random_sort(List l)
{
Node *p; int x; int n;
{
For(int i=1;i<=n;i++)
{
X=random()%100;
P=tao_random(x);
If(l.pHead= =NULL)
l.pHead=l.pTail=p;
else
{
p->pPrew=l.pTail;
l.pTail->pNext=p;
l.pTail=p;
}
}
}
163. Xây dựng giải thuật và viết hàm tạo một node mới:
Node *tao_node_moi(List l)
{
Node *p;
p=new_Node;
If(p= =NULL)
Return NULL;
p->data=l;
p->pNext=NULL;
retutn p;
}
164. Xây dựng giải thuật và viết hàm nhập một số nguyên vào danh sách:
Void nhap_songuyen(List &l)
{
Int n;
Cout<<”n nhap so luong node:”;
Cin>> n;
Init(l);
For(int i=1;i<=n;i++)
{
Int x;
Cout<<”n nhap mot so nguyen:”;
Cin>> x;
Node*p=getnode(x);
Themdau(l,p);
}
}
165. Xây dựng giải thuật và viết hàm duyệt qua các nút trong một danh sách:
Void duyet_ds(List l)
{
Node *p;
p=l.pHead;
while (p!=NULL)
{
Duyet_Node(p);
p=p->pNext;
}
}
166. Xây dựng giải thuật và viết hàm tìm kiếm một phần tử X trong danh sách:
Node *search(List l,int x)
{
Node *p;
P=l.pHead;
While((p!=NULL)&&(p->data!=x))
p=p->link;
return p;
}
167. Xây dựng giải thuật và viết hàm sao chép danh sách thành môt danh sách và
sắp sếp:
Void sao_chep_va_sap_xep(List &l)
168. Xây dựng giải thuật và viết hàm đảo ngược danh sách:
Void dao_ds(List &l)
169. Xây dựng giải thuật và viết hàm cộng liêntiếphai phần tử trong danh sách:
Void cong_lien_tiep_2pt(List &l)
170. Xây dựng giải thuật và viết hàm tách danh sách:
Void tach_List(List &l, List &l1,List &l2)
{
Khoitao(l1);
Khoitao(l2);
Do
{
P=l.pHead;
l.pHead=p->pNext;
p->pHead=NULL;
if(p->data%2==0)
themdau2(l1,p);
else
themdau2(l2,p);
}
While(l.pHead!=NULL)
l.pTail=NULL;
}
171. Xây dựng giải thuật và viết hàm nối hai danh sách:
Void noi_ds(List &l,List &l1,List &l2)
{
Khoitao(l1);
Khoitao(l2);
Cout<<”n nhap danh sach l1.ketthuc-1”;
Tao_ds(l1);
Cout <<”n nhap danh sachl2.ketthuc-1”;
Tao_ds(l2);
If(l1.pHead==NULL)
l=l2;
if(l2.pHead==NULL)
l=l1;
else
{
l1.pTail->pNext=l2.pHead;
l.pHead=l1.pHead;
l.pTail=l2.pTail;
}
}
III: DANH SÁCH LIÊN KẾT KÉP
172. Khai báo cấu trúc dữ liệucủa một danh sách liênkết đơn tổng quát
typedef struct tagNode
{
int data;
struct tagNode *pnext;
}Node;
173. Xây dựng giải thuật và viết hàm khởi tạo danh sách liênkết đơn
void khoi_tao(List &l)
{
l.phead=l.ptail=NULL;
}
174. Xây dựng giải thuật và viết hàm định nghĩa danh sách liênkết
Typedef struct tag_List
{
Node *phead;
Node *ptail;
}List;
175. Xây dựng giải thuật và viết hàm tạo nút danh sách liênkết đơn
Node* getNode(int x)
{Node *p=new Node;
if(p==NULL)
{cout<<"nKhong du bo nho";
exit(0);
}
p->pprev=NULL;
p->data=x;
p->pnext=NULL;
return p;
}
176. Xây dựng giải thuật và viết hàm tạo danh sách ngẫu nhiên
void tao_dsng(List &l)
{int n,x;
Node *p;
cout<<"Nhap so pt n:t";
cin>>n;
for(int i=1;i<=n;i++)
{
x=rand()%500-rand()%500; //nh?p ng?u nhiên
p=getNode(x);
if(l.phead==NULL)
l.phead=l.ptail=p;
else
{p->pnext=l.phead;
l.phead->pprev=p;
l.phead=p;
}
}
}
177. Nhập bằng tay
void tao_ds(List &l)
{int n,x;
Node *p;
cout<<"Nhap so pt n:t";
cin>>n;
for(int i=1;i<=n;i++)
{cout<<"Nhap x:";
cin>>x;
p=getNode(x);
if(l.phead==NULL)
l.phead=l.ptail=p;
else
{p->pnext=l.phead;
l.phead->pprev=p;
l.phead=p;
}
}
}
178. Xây dựng giải thuật và viết hàm duyệt danh sách liênkết
void xuat_ds(List l)
{Node *p=l.phead;
while(p)
{cout<<p->data<<" -> ";
p=p->pnext;
}
cout<<"Null"<<endl;
}
179. Xây dựng giải thuật và viết hàm đếm số lượng node trong danh sách liênkết
đơn
180. Xây dựng giải thuật và viết hàm đếm số lượng node có giá trị âm
181. Xây dựng giải thuật và viết hàm kiểm tra danh sách liênkết tồn tại node có
giá trị dương hay không?
182. Chèn 1 pt vào đầu ds
void them_dau(List &l,int x)
{
cout<<"nNhap pt muon them:";
cin>>x;
Node *p=getNode(x);
if(l.phead==NULL)
l.phead=l.ptail=p;
else
{
p->pnext=l.phead;
l.phead->pprev=p;
l.phead=p;
}
}
183. Xây dựng giải thuật và viết hàm chèn phần tử vào cuối danh sách
void them_cuoi(List &l,int x)
{ cout<<"Nhap pt muon them:";
cin>>x;
Node *p=getNode(x);
if(l.ptail==NULL)
l.phead=l.ptail=p;
else
{p->pprev=l.ptail;
l.ptail->pnext=p;
l.ptail=p;
}
}
184. Xây dựng giải thuật và viết hàm thêm 1 nút vào sau pt có giá trị là y
void themsau_q(List &l,int x,int y)
{
if(l.phead==NULL)
cout<<"danh sach rong";
else
{ Node *q;
q=timpt_y(l,y);
if(q==NULL)
cout<<"khong tim thay pt thoa yeu cau";
else{
if(q==l.ptail)
them_cuoi(l,x);
else
{
Node *k;
cout<<"nhap pt can them: ";
cin>>x;
cout<<endl;
k=getNode(x);
k->pnext=q->pnext;
q->pnext=k;
k->pprev=q;
}
}
}
}
185. Xây dựng giải thuật và viết hàm thêm 1 nút vào trước phần tử có giá trị y
void themtruoc_q(List &l,int x,int y)
{
if(l.phead==NULL)
cout<<"danh sach rong";
else
{ Node *q;
q=timpt_y(l,y);
if(q==NULL)
cout<<"khong tim thay pt thoa y/cau";
else
{
if(q==l.phead)
them_dau(l,x);
else
{
cout<<"nhap pt can them: ";
cin>>x;
Node *p=getNode(x);
(q->pprev)->pnext=p;
p->pprev=q->pprev;
q->pprev=p;
p->pnext=q;
}
}
}
}
186. Xây dựng giải thuật và viết hàm thêm 1 nút vào trước chẳn đầu
void ThemX_truoc_chan_dau(LIST &l)
{
NODE *p;int y;
if(chan_dau(l) = = NULL) // khong tim thay chan dau, them x vao dau dsach
themdau(l);
else // tim thay, thuc hien them truoc chan dau
{
cout<<"Nhap phan tu Y can them truoc chan dau "<<tim_chan_dau(l)-
>data<<" ";cin>>y;
themtruoc_q( l , chan_dau(l)->data,y);
}
}
187. Xây dựng giải thuật và viết hàm xóa đầu
void xoa_dau(List &l)
{Node *p;
if(l.phead==NULL)
cout<<"DANH SACH RONG~";
else
{
if(l.phead==l.ptail)
l.phead=l.ptail=NULL;
else
{p=l.phead;
l.phead=p->pnext;
l.phead->pprev=NULL;
delete(p);
}
}
}
188. Xây dựng giải thuật và viết hàm xóa cuối
void xoa_cuoi(List &l)
{
Node *p;
if(l.phead==NULL)
cout<<"DANH SACH RONG~";
else
{
if(l.phead==l.ptail)
l.phead=l.ptail=NULL;
else
{p=l.ptail;
l.ptail=p->pprev;
l.ptail->pnext=NULL;
delete(p);
}
}
}
189. Xây dựng giải thuật và viết hàm xóa 1 nút trước pt có giá trị y
void xoatruoc_q(List &l,int y)
{
Node *q,*p;
if(l.phead==NULL)
cout<<"Danh sach rong~";
else
{
p=timpt_y(l,y);
if(p!=NULL)
{
q=p->pprev;
if(q!=NULL)
{
p->pprev=q->pprev;
if(q==l.phead) l.phead=p;
else
q->pprev->pnext=p;
delete(q);
}
else cout<<"nkhong co pt xoat";
}
else xoa_cuoi(l);
}
}
190. Xây dựng giải thuật và viết hàm xóa 1 nút sau pt có giá trị y
void xoasau_q(List &l,int y)
{
Node *p;
Node *q;
if(l.phead==NULL)
cout<<"Danh sach rong~";
else
{
cout<<"Nhap pt y can tim:t";
cin>>y;
q=timpt_y(l,y);
if(q!=NULL)
{ p=q->pprev;
if(p!=NULL)
{
q->pnext=p->pnext;
p->pnext->pprev=q;
delete(p);
{
cout<<"lol~...Null";
}
else xoa_dau(l);
}
}
191. Xây dựng giải thuật và viết hàm xóa phần tử x
void xoapt_y(List l,int y)
{ Node *q;
if(l.phead->data==y)
xoa_dau(l);
else
{if(l.ptail->data==y)
xoa_cuoi(l);
else
{
Node *p=l.phead->pnext;
while(p)
{
if(p->data==y)
q=p->pnext;
q=p->pnext;
q->pprev=p->pprev;
p->pprev->pnext=q;
delete(p);
p=q; continue;
}
p=p->pnext;
}
}
}
192. Xây dựng giải thuật và viết hàm xóa phần tử lớn nhất
void xoa_max(List &l,int max)
{if(l.phead==NULL)
cout<<"ds rong";
else
{if(l.phead==l.ptail)
l.phead=l.ptail=NULL;
else
{if(l.phead->data==max)
xoa_dau(l);
if(l.ptail->data==max)
xoa_cuoi(l);
else
{
Node *p=l.phead->pnext;
while(p)
{
if(p->data==max)
Node *q=p->pnext;
q->pprev=p->pprev;
p->pprev->pnext=q;
delete(p);
p=q;continue;
}
p=p->pnext;
}
}
}
}
193. Xây dựng giải thuật và viết hàm xóa List
void xoa_LIST(List &l)
{
Node *k = l.phead;
while(k!=NULL)
{
l.phead=k->pnext;
k=l.phead;
}
}
194. Xây dựng giải thuật và viết hàm đổi chỗ trực tiếp(interchange sort)
void inter_sort(List l)
{
for(Node *p=l.phead;p!=l.ptail;p=p->pnext)
{for(Node *k=p->pnext;k;k=k->pnext)
{
if(p->data>k->data)
hoanvi(p->data,k->data);
}
}
}
195. Xây dựng giải thuật và viết hàm sắp xếp chọn trực tiếp(selectionsort)
void selection_sort(List l)
{
for(Node *p=l.phead;p!=l.ptail;p=p->pnext)
{
Node *k=p;
for(Node *q=p->pnext;q;q=q->pnext)
{
if(k->data>q->data)
k=q;
}
hoanvi(k->data,p->data);}
}
196. Xây dựng giải thuật và viết hàm sắp xếp nổi bọt(Bubble sort)
void bubble(List l)
{
Node *dau, *cuoi;
for(dau=l.phead;dau!=l.ptail;dau=dau->pnext)
{
for(cuoi=l.ptail;cuoi!=dau;cuoi=cuoi->pprev)
{
if(cuoi->data < (cuoi->pprev)->data)
hoanvi(cuoi->data,(cuoi->pprev)->data);
}
}
}
197. Xây dựng giải thuật và viết hàm sắp xếp chèn trực tiếp(insertionsort)_
void insertion_sort(List l)
{
Node *pos;int x;
for(Node *p=l.phead->pnext;p;p=p->pnext)
{
x = p->data; pos=p->pprev;
while( (pos!= NULL) && (pos->data > x ) )
{
x = pos->data;
pos=pos->pprev;
}
pos->data = x;
}
198. Xây dựng giải thuật và viết hàm sắp xếp phân hoạch nhanh (Quick sort)
void quick_sort(List &l)
{ List l1;List l2;
if(l.phead= =NULL) // rong
return;
else
khoi_tao(l1);
khoi_tao(l2);
Node *x=l.phead;
l.phead=x->pnext;
while(l.phead!=NULL){
Node *p=l.phead;
l.phead=p->pnext;
p->pnext=NULL;
if(p->data <= x->data)
them_dau2(l1,p);
else
them_dau2(l2,p);
}
quick_sort(l1);
quick_sort(l2);
if(l1.phead==NULL)
l.phead=x;
else
{
l.phead = l1.phead;
l1.ptail->pnext = x;
}
x->pnext = l2.phead;
if(l2.phead==NULL)
l.ptail = x;
else
{
l.ptail = l2.ptail;
}
}
199. Xây dựng giải thuật và viết hàm tổng danh sách
long tong_list(List l)
{
Node*k=l.phead;
int tong = 0;
for(k;k!=NULL;k=k->pnext)
{
tong+=k->data;
}
return tong;
}
200. Xây dựng giải thuật và viết hàm tổng các phần tử dương
long tong_duong(List l)
{
Node *pi=l.phead;
int s = 0;
for(pi;pi!=NULL;pi=pi->pnext)
{if(pi->data>0)
s+=pi->data;
}return s;
}
201. Xây dựng giải thuật và viết hàm tổng các phần tử âm
long tong_am(List l)
{
Node *pi=l.phead;
int s = 0;
for(pi;pi!=NULL;pi=pi->pnext)
{if(pi->data<0)
s+=pi->data;
}return s;
}
202. Xây dựng giải thuật và viết hàm tổng các phần tử lớn hơn pt liềntrước nó
long tonglonlientruoc(List l)
{
int s=0;
for(Node *pi=l.phead->pnext;pi;pi=pi->pnext)
{if(pi->data > pi->pprev)
s+=pi->data
}return s;
}
203. Xây dựng giải thuật và viết hàm tổng các phần tử lớn hơn trị tuyệt đối đứng
liềnsau nó
long ttd_liensau(List l)
{ int s=0;
for(Node *p=l.phead;p;p=p->pnext)
{ if(p->data > abs(p->pnext) )
{ s+=p->data; }
}return s;
}
204. Xây dựng giải thuật và viết hàm trung bình cộng các số dương
long tbc_duong(List l)
{int s=0;int dem=0;
for(Node *p=l.phead;p;p=p->pnext)
{if(p->data>0)
s+=p->data;
dem++;
}if(dem= =0)
{cout<<”nKo co pt thoa y/c”;
return 0;
}
return s/dem;
}
205. Xây dựng giải thuật và viết hàm trung bình cộng các số lớn hơn x
long tbc_lon_x(List l,int x)
{int s=0;int dem=0;
for(Node *p=l.phead;p;p=p->pnext)
{if(p->data>x)
s+=p->data;
dem++;
}if(dem= =0)
{cout<<”nKo co pt thoa y/c”;
return 0;
}
return s/dem;
}
206. Xây dựng giải thuật và viết hàm tổng các pt lớn hơn pt xung quanh
long lonhonptxungquanh(List l,)
{int s=0;
for(Node *p=l.phead;p;p=p->pnext)
{if(p= =l.phead && p->data > p->pnext)
s+ =p->data;
if(p!=l.phead && p->data > p->pnext && p->data > p->pprev)
s+ =p->data;
if(p=l.ptail && p->data>p->pprev)
s+ =p->data;
}return s;
}
207. Xây dựng giải thuật và viết hàm đếm số chẳn
long dem_chan(List l)
{
int dem=0;
for(Node *p=l.phead;p;p=p->pnext)
{
if(p->data%2==0)
dem++;
}return dem;
}
208. Xây dựng giải thuật và viết hàm đếm số lẻ
long dem_le(List l)
{
int dem=0;
for(Node *p=l.phead;p;p=p->pnext)
{
if(p->data%2!=0)
dem++;
}return dem;
}
209. Xây dựng giải thuật và viết hàm đếm dương chia hết cho 7
long duongchia7(List l)
{
int dem=0;
for(Node *p=l.phead;p;p=p->pnext)
{
if(p->data>0 && p->data%7==0)
{
dem++;
}
}return dem;
}
210. Xây dựng giải thuật và viết hàm đếm số lần xuất hiện của x
long demlanxuathien(List l,int x)
{
int dem=0;
for(Node *p=l.phead;p;p=p->pnext)
{
if(p->data==x)
dem++;
}
return dem;
}
211. Xây dựng giải thuật và viết hàm đếm 2 pt kề nhau mà cả 2 trái dấu
long demketraidau(List l)
{
int dem=0;
for(Node *p=l.phead;p;p=p->pnext)
{
if( (p->data) * (p->pnext) <0 )
dem++;
}
return dem;
}
212. Xây dựng giải thuật và viết hàm đếm pt lớn hơn hay nhỏ hơn pt xung quanh
long demlonnho(List l)
{int dem=0;
for(Node *p=l.phead;p;p=p->pnext)
{if(p= =l.phead && p->data!=p->pnext)
dem++;
if(p= =l.ptail && p->data!=p->pprev)
dem++;
if((p->data>p->pnext && p->data>p->pprev) | | (p->data<p->pnext && p->data<p-
>pprev))
dem++;
}return dem;
}
213. Xây dựng giải thuật và viết hàm đếm pt max
long dem_max(List l)
{int dem=0;
Node *pmax=l.phead;
for(pmax;pmax;pmax=pmax->pnext)
{for(p=pmax->pnext;p;p=p->pnext)
{if(pmax->data < p->data)
{pmax=p;dem++;}
}
}return dem;
}
214. Xây dựng giải thuật và viết hàm đếm pt kề nhau mà cà đều chẳn
long ke_chan(List l)
{int dem=0;
for(Node *p=l.phead;p;p=p->pnext)
{if(p->data%2= =0 && p->pnext%2= =0)
dem++;
}
return dem;
}
215. Xây dựng giải thuật và viết hàm đếm số nguyên tố
int KTSNT(int n)
{
if(n<2) return 0;
for(int i=2;i<=n/2;i++)
if(n%i= =0) return 0;
return 1;
}
int dem_so_ngto(List l)
{
Node *k=l.phead;
int dem=0;
for(k;k!=NULL;k=k->pnext)
{
if(KTSNT(k->data) = = 1)
dem++;
}
return dem;
}
216. Xây dựng giải thuật và viết hàm đếm số nút trong danh sách
int count_node(List l)
{
Node *k=l.phead;
int count = 0;
for(k;k!=NULL;k=k->pnext)
{
count++;
}
return count;
}
217. Kiểm tra danh sách có giá trị 0?
int kt0(List l)
{
int flag=0;
for(Node *p=l.phead;p;p=p->pnext)
{
if(p->data= =0)
{flag=1;
break;}
}
return flag;
}
218. Kiểm tra danh sách có số chẳn hay ko?
int kt_chan(List l)
{
int flag=0;
for(Node *p=l.phead;p;p=p->pnext)
{
if(p->data%2= =0)
{
flag=1;
cout<<"nDS CO GIA TRI CHAN";break;
}
}if(flag= =0){cout<<"nKO TIM THAY GTRI CHAN";}
return flag;
}
219. Xây dựng giải thuật và viết hàm kiểm tra danh sách có tính chất lẻ(lẻ khi tổng
2 pt liêntiếpluônlẻ)
int kt_chanle(List l)
{
int flag=1;
for(Node *p=l.phead;p!=l.ptail;p=p->pnext)
{
if( (p->data+p->pnext->data)%2==0)
{
flag=0;
cout<<"nDS KO CO TINH CHAT LE";
break;
}
}if(flag= =1){cout<<"DS CO TC LE";}
return flag;
}
220. Xây dựng giải thuật và viết hàm kiểm tra danh sách co tăng dần
int kt_tang(List l)
{
int flag=1;
for(Node *p=l.phead;p!=l.ptail;p=p->pnext)
{
if(p->data>p->pnext->data)
{
flag=0;
cout<<"n DS CHUA TANG";
break;
}
}if(flag= =1){cout<<"nDS DA DUOC SX TANG DAN";}
return flag;
}
221. Xây dựng giải thuật và viết hàm kiểm tra phần tử trong danh sách có bằng
nhau
int kt_bang(List l)
{
int flag=0;
for(Node *p=l.phead;p;p=p->pnext)
{
for(Node *k=p->pnext;k;k=k->pnext)
{
if(p->data==k->data)
{
flag=1;cout<<"nDS CO PT BANG NHAU";
break;
}
}
}if(flag= =0){cout<<"nDS KO CO PT NAO BANG NHAU";}
return flag;
}
222. Xây dựng giải thuật và viết hàm kiểm tra danh sách có giảm dần
int kt_giam(List l)
{
int flag=1;
for(Node *p=l.phead;p!=l.ptail;p=p->pnext)
{
if(p->data<p->pnext->data)
{
flag=0;
cout<<"n DS CHUA TANG";
break;
}
}if(flag= =1){cout<<"nDS DA DUOC SX TANG DAN";}
return flag;
}
223. Xây dựng giải thuật và viết hàm đếm thỏa: lớn hơn các pt trước nó
int dem_kt(List l)
{int flag=1;
for(Node *p=l.ptail;p!=l.phead;p=p->pprev)
{for(Node *k=p->pprev;k;k=k->pprev)
{if(p->data<k->data | | p->data = = k->data)
flag=0;break;
}
}
if(flag= =1){cout<<”n Co pt thoa y/c”;
else cout<<”nKhong thoa”;
return flag;
}
224. Xây dựng giải thuật và viết hàm kiểm tra danh sách có 2 giá trị 0 liêntiếp?
int kt0_lientiep(List l)
{
int flag=0;
for(Node *p=l.phead;p!=l.ptail;p=p->pnext)
{
if(p->data= =0 && p->pnext->data = = 0)
{flag=1;
break;}
}return flag;
}
225. Xây dựng giải thuật và viết hàm kiểm tra danh sách có toàn sồ chẳn ?
int kt_toan_chan(List l)
{
int flag=1;
for(Node *p=l.phead;p;p=p->pnext)
{
if(p->data%2 ! =0)
{
flag=0;
break;
}
}
return flag;
}
226. Xây dựng giải thuật và viết hàm tìm pt chẳn max và lớn hơn pt lẻ max
int kiem_tra_chan(List l)
{
Node *p =l.phead; int dem=0;
while(p)
{
if(p->data % 2==0)
dem++;
p=p->pnext;
}
if( dem == 0)
return 0;
return 1;
}
int kiem_tra_le(List l)
{
Node *p =l.phead; int dem=0;
while(p)
{
if(p->data % 2!=0)
dem++;
p=p->pnext;
}
if( dem == 0)
return 0;
return 1;
}
Node* chanmax(List l)
{
int x;
Node *p=l.phead;Node *maxx = getNode(x);
if(kiem_tra_chan(l) == 0)
return NULL;
else{
while(p)
{
if((p->data % 2 == 0) && (p->data > maxx->data))
maxx=p;
p=p->pnext;
}
return maxx;
}
}
Node* lemax(List l)
{
int x;
Node *p=l.phead; Node *maxx = getNode(x);
if(kiem_tra_le(l) == 0)
return NULL;
else{
while(p)
{
if((p->data % 2 != 0) && (p->data > maxx->data))
maxx=p;
p=p->pnext;
}
return maxx;
}
}
void chanmax_max_minmax(List &l)
{
Node *chanm = chanmax(l);
Node *lem = lemax(l);
if(chanm->data < lem->data)
cout<<"Khong thoa y/c! So chan lon nhat la: "<<chanm->data<<" nho hon so
le lon nhat la: "<<lem->data;
if(chanm->data > lem->data)
cout<<"Thoa y/c! So chan lon nhat la: "<<chanm->data<<" va so le lon nhat
la: "<<lem->data;
}
227. Xây dựng giải thuật và viết hàm tìm max
Node *tim_max(List l)
{
Node *pmax=l.phead;
for(Node *pi=l.phead->pnext;pi!=NULL;pi=pi->pnext)
{
if(pi->data>pmax->data)
pmax=pi;
}
cout<<"Pt max la: "<<pmax->data;
return pmax;
}
228. Xây dựng giải thuật và viết hàm tìm dương đầu tiên
Node *duong_dau(List l)
{
Node *pi=l.phead;
for(pi;pi;pi=pi->pnext)
{
if(pi->data>0)
{
cout<<"n Pt duong dau tien la: "<<pi->data;
return pi;
}
}cout<<"nKO TIM THAY PT DUONG";
}
229. Xây dựng giải thuật và viết hàm tìm chẳn cuối cùng
Node *chan_cuoi(List l)
{
for(Node *pi=l.ptail;pi;pi=pi->pprev)
{
if(pi->data%2==0)
{
cout<<"n Chan cuoi la: "<<pi->data;
return pi;}
}cout<<"n KO TIM THAY SO CHAN CUOI";
}
230. Xây dựng giải thuật và viết hàm tìm chẳn đầu
Node *chan_dau(List l)
{
for(Node *pi=l.phead;pi;pi=pi->pnext)
{
if(pi->data%2==0)
{
cout<<"n Chan dau la: "<<pi->data;
return pi;}
}cout<<"n KO TIM THAY SO CHAN DAU";
}
231. Xây dựng giải thuật và viết hàm tìm dương min
Node *duong_min(List l)
{
Node *duongmin;
for(duongmin=l.phead;duongmin;duongmin=duongmin->pnext)
{
if(duongmin->data>0)
{
break;
}
}
if(duongmin!=NULL)
{
for(Node *k=duongmin->pnext;k;k=k->pnext)
{
if( (k->data>0) && (duongmin->data>k->data) )
{
duongmin=k;
cout<<"nDuong min:"<<duongmin->data;break;
}
}return k;
}else cout<<"n KO THAY PT DUONG MIN";
}
232. Xây dựng giải thuật và viết hàm tìm min
Node *tim_min(List l)
{
Node *pmin=l.phead;
for(Node *pi=l.phead->pnext;pi!=NULL;pi=pi->pnext)
{
if(pi->data<pmin->data)
pmin=pi;
}
cout<<"Pt min la: "<<pmin->data;
return pmin;
}
233. Xây dựng giải thuật và viết hàm tìm âm đầu
Node *am_dau(List l)
{
Node *pi=l.phead;
for(pi;pi;pi=pi->pnext)
{
if(pi->data<0)
{
cout<<"n Am dau la: "<<pi->data;
return pi;}
}cout<<"n KO TIM THAY PT AM DAU";
}
IV: CÂY NHỊ PHÂN
234. Khai báo cây nhị phân
struct Tree
{
int Data;
Tree *Left;
Tree *Right;
};
235. Xây dựng giải thuật và viết hàm tạo cây nhị phân tìm kiếm
void InsertNode(Tree* &T,int d)//Tao Cay Nhi Phan Tim Kiem
{
if(T!=NULL)
{
if(T->Data==d)
return;
if(T->Data>d)
InsertNode(T->Left,d);
if(T->Data<d)
InsertNode(T->Right,d);
}
else
{
T=new Tree;
T->Data=d;
T->Left=NULL;
T->Right=NULL;
return;
}
}
236. Xây dựng giải thuật và viết hàm duyệt cây nhị phân
void Left_Node_Right(Tree* T)//In Kieu LNR;
{
if(T!=NULL)
{
Left_Node_Right(T->Left);
printf("%5d",T->Data);
Left_Node_Right(T->Right);
}
}
237. Xây dựng giải thuật và viết hàm duyệt cây nhị phân
void Get_Tree(Tree* &T)//Nhap Cay Nhi phan Tim Kiem
{
int i,d=10,x;
printf("nNhap so phan tu cua mot cay : ");
scanf("%d",&d);
for(i=0;i<d;i++)
{
printf("Nhap phan tu thu %d = ",i+1);
scanf("%d",&x);
InsertNode(T,x);
}
}
238. Xây dựng giải thuật và viết hàm đếm số nút của cây
int Count_Node(Tree* T)//dem so nut
{
static int dem=0;
if(T!=NULL)
{
Count_Node(T->Left);
dem++;
Count_Node(T->Right);
}
return dem;
}
239. Xây dựng giải thuật và viết hàm đếm số nút có giá trị dương có trong cây
240. Xây dựng giải thuật và viết hàm tìm phần tử có giá trị lớnnhất trong cây
241. Xây dựng giải thuật và viết hàm đếm số nút lá
int Count_Leaf_Node(Tree* T)//Dem so nut la
{
static int dem=0;
if(T!=NULL)
{
Count_Leaf_Node(T->Left);
if(T->Left==NULL&&T->Right==NULL)
dem++;
Count_Leaf_Node(T->Right);
}
return dem;
}
242. Xây dựng giải thuật và viết hàm đếm số nút có một cây con trái
int Count_Left_Node(Tree* T)//Dem so nut co mot cay con trai
{
static int dem=0;
if(T!=NULL)
{
Count_Left_Node(T->Left);
if(T->Left!=NULL)
dem++;
Count_Left_Node(T->Right);
}
return dem;
}
243. Xây dựng giải thuật và viết hàm đếm số nút có một cây con
int Count_One_Node(Tree* T)//Dem so nut co mot cay con
{
static int dem=0;
if(T!=NULL)
{
Count_One_Node(T->Left);
if(T->Left!=NULL&&T->Right==NULL||T->Left==NULL&&T->Right!=NULL)
dem++;
Count_One_Node(T->Right);
}
return dem;
}
244. Xây dựng giải thuật và viết hàm đếm độ sâu
int Count_Depth(Tree *T,int dem=0)//Dem do sau
{
static int max=0;
if(T!=NULL)
{
Count_Depth(T->Left,++dem);
dem--;
Count_Depth(T->Right,++dem);
dem--;
}
else
{
if(dem>max)
max=dem;
}
return max;
}
245. Xây dựng giải thuật và viết hàm hủy một nút có khóa là X trong cây nhị phân
246. Xây dựng giải thuật và viết hàm tính tổng các nút trong cây
247. Xây dựng giải thuật và viết hàm tính tổng các nút là trong cây
248. Xây dựng giải thuật và viết hàm tính tổng các nút có một nút con
249. Xây dựng giải thuật và viết hàm tính tổng các nút có đúng hai nút con
250. Xây dựng giải thuật và viết hàm tính tổng các nút có giá trị lẽ
251. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong cây
252. Xây dựng giải thuật và viết hàm tìm giá trị âm lớn nhất trong cây
1. Xây dựng giải thuật và viết hàm nhập mảng bằng tay............................................ 1
2. Xây dựng giải thuật và viết hàm nhập mảng ngẫu nhiên....................................... 1
3. Xây dựng giải thuật và viết hàm nhập mảng đệ quy ............................................... 1
4. Xây dựng giải thuật và viết hàm xuất mảng .............................................................. 1
5. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong mảng một chiều n
số nguyên ...................................................................................................................................... 1
6. Xây dựng giải thuật và viết hàm tìm giá trị dương đầu tiêntrong mảng, không
có trả về 0 ..................................................................................................................................... 2
7. Xây dựng giải thuật và viết hàm tìm số chẵn cuối cùng trong mảng, không có
thì trả về 0..................................................................................................................................... 2
8. Xây dựng giải thuật và viết hàm tìm vị trí của phần tử nhỏ nhất trong mảng.. 2
9. Xây dựng giải thuật và viết hàm tìm vị trí của giá trị chẵn đầu tiêntrong
mảng, không có thì trả về 0 ...................................................................................................... 2
10. Xây dựng giải thuật và viết hàm tìm vị trí số hoàn thiện cuối cùng trong mảng,
không có trả về 0 ......................................................................................................................... 3
11. Xây dựng giải thuật và viết hàm tìm vị trí dương nhỏ nhất trong mảng, không
có trả về 0. .................................................................................................................................... 3
12. Xây dựng giải thuật và viết hàm tìm số nguyên tố đầu tiêntrong mảng, không
có trả về 0. .................................................................................................................................... 3
13. Xây dựng giải thuật và viết hàm tìm số nguyên tố lớn nhất trong mảng, không
có trả về 0. .................................................................................................................................... 4
14. Xây dựng giải thuật và viết hàm tìm số hoàn thiệncuối cùng trong mảng,
không có trả về 0......................................................................................................................... 5
15. Xây dựng giải thuật và viết hàm tìm số hoàn thiện nhỏ nhất trong mảng, không
có trả về 0. .................................................................................................................................... 5
16. Xây dựng giải thuật và viết hàm tìm giá trị chẵn nhỏ nhất trong mảng, không
có trả về 0. .................................................................................................................................... 6
17. Xây dựng giải thuật và viết hàm tìm vị trí có giá trị âm lớn nhất trong mảng,
không có thì trả về -1. ................................................................................................................ 6
18. Xây dựng giải thuật và viết hàm tìm những phần tử trong mảng xa giá trị x
nhất. ............................................................................................................................................... 6
19. Xây dựng giải thuật và viết hàm tìm vị trí trong mảng mà giá trị tại đó gần x
nhất. ............................................................................................................................................... 7
20. Xây dựng giải thuật và viết hàm tìm đoạn [a,b] sao cho đoạn này chứa tất cả
các giá trị trong mảng................................................................................................................ 7
21. Xây dựng giải thuật và viết hàm tìm trong mảng giá trị đầu tiên lớn hơn 2010,
không có trả về 0......................................................................................................................... 7
22. Xây dựng giải thuật và viết hàm tìm trong mảng giá trị đầu tiên nằm trong
khoảng (X,Y) cho trước, không có thì trả về X. .................................................................. 8
23. Xây dựng giải thuật và viết hàm tìm số chính phương đầu tiên trong mảng,
không có thì trả về 0................................................................................................................... 8
24. Xây dựng giải thuật và viết hàm tìm một vị trí của phần tử đầu tiên có giá trị
bằng tích hai phần tử lân cận, nếu mảng không tồn tại phần tử thỏa điều kiện trên
thì trả về 0. ................................................................................................................................... 8
25. Xây dựng giải thuật và viết hàm tìm giá trị đầu tiêntrong mảng thỏa tính chất
số gánh không có thì trả về 0 ( ví dụ: 12321)........................................................................ 8
26. Xây dựng giải thuật và viết hàm tìm giá trị đầu tiêncó chữ số đầu tiênlà chữ
số lẻ trong mảng, không có thì trả về 0 ( ví dụ: 110). ......................................................... 9
27. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất toàn chữ số lẻ so với
những số cùng thỏa điều kiện trong mảng, không có thì trả về 0.................................... 9
28. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong mảng có dạng 2^k,
so với những số cùng thỏa điều kiện, nếu mảng không có phần tử dạng 2^k thì trả
về 0. 10
29. Xây dựng giải thuật và viết hàm tìm số chẵn lớn nhất, nhỏ hơn mọi giá trị lẻ có
trong mảng một chiều n số nguyên, nếu mảng chỉ chứa các phần tử lẻ hoặc chẵn thì
return 0. ......................................................................................................................................11
30. Xây dựng giải thuật và viết hàm tìm số nguyên tố nhỏ nhất, lớn hơn mọi giá trị
có trong mảng............................................................................................................................11
31. Xây dựng giải thuật và viết hàm liệt kê các phần tử thuộc đoạn [x,y] cho trước
trong mảng.................................................................................................................................11
32. Xây dựng giải thuật và viết hàm liệt kê các số trong mảng một chiều thỏa điều
kiện: lớn hơn trị tuyệt đối của số đứng liền sau nó...........................................................12
33. Xây dựng giải thuật và viết hàm tính tổng các phần tử trong mảng một chiều n
số nguyên. ...................................................................................................................................12
34. Xây dựng giải thuật và viết hàm tính tổng các phần tử dương trong mảng. ....12
35. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số đầu là lẻ trong
mảng, vd: 15, 30, ......................................................................................................................13
36. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số hàng chục là 5
trong mảng.................................................................................................................................13
37. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn phần tử đứng
liền trước nó trong mảng. .......................................................................................................14
38. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn giá trị tuyệt đối
của phần tử đứng liền sau nó.................................................................................................14
39. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn phần tử xung
quanh trong mảng. ...................................................................................................................14
40. Xây dựng giải thuật và viết hàm tính tổng các phần tử cực trị trong mảng.
Phần tử cực trị là phần tử lớn hơn hoặc nhỏ hơn hai phần tử xung quanh. ..............14
41. Xây dựng giải thuật và viết hàm tính tổng các phần tử là số chính phương
trong mảng.................................................................................................................................15
42. Xây dựng giải thuật và viết hàm tính tổng các phần tử là số đối xứng trong
mảng, vd:12321( số gánh )......................................................................................................15
43. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số đầu là chẵn
trong mảng.................................................................................................................................16
44. Xây dựng giải thuật và viết hàm tính trung bình cộng các phần tử dương trong
mảng. ...........................................................................................................................................16
45. Xây dựng giải thuật và viết hàm tính trung bình cộng các số nguyên tố trong
mảng. ...........................................................................................................................................16
46. Xây dựng giải thuật và viết hàm tính trung bình cộng các phần tử trong mảng
lớn hơn x.....................................................................................................................................17
47. Xây dựng giải thuật và viết hàm tính khoảng cách trung bình giữacác phần tử
trong mảng.................................................................................................................................17
48. Xây dựng giải thuật và viết hàm đếm số lượng phần tử chẵn có trong mảng
một chiều n số nguyên. ............................................................................................................17
49. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử dương chia hết cho
7 trong mảng..............................................................................................................................18
50. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử thỏa tính chất số
gánh ( số đối xứng ) trong mảng. ..........................................................................................18
51. Xây dựng giải thuật và viết hàm đếm số lần xuất hiện của giá trị X trong mảng.
18
52. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử có chữ số tận cùng
bằng 5 trong mảng. ..................................................................................................................19
53. Xây dựng giải thuật và viết hàm cho biết sự tương quan giữa số lượng chẵn và
lẻ trong mảng, hàm trả về một trong ba giá trị: -1, 0, 1. -1 là lẻ nhiều hơn chẵn; 0 là
chẵn bằng lẻ; 1 là chẵn nhiều hơn lẻ....................................................................................19
54. Xây dựng giải thuật và viết hàm đếm phần tử cùng lớn hơn hoặc nhỏ hơn các
phần tử xung quanh trong mảng ( đếm phần tử cực trị ). ..............................................19
55. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử là số nguyên tố
trong mảng.................................................................................................................................20
56. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử là số hoàn thiện
trong mảng.................................................................................................................................20
57. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử lớn nhất trong
mảng. ...........................................................................................................................................21
58. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau mà cả hai
đều là chẵn (kề trước hoặc kề sau và chẵn)........................................................................21
59. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau mà cả hai
trái dấu nhau ( kề trước hoặc kề sau và trái dấu).............................................................21
60. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau, mà số
đứng trước cùng dấu với số đứng sau và có giá trị tuyệt đối nhỏ hơn trị tuyệt đối của
số đứng sau.................................................................................................................................21
Bài tập CTDL và GT 8
Bài tập CTDL và GT 8
Bài tập CTDL và GT 8
Bài tập CTDL và GT 8
Bài tập CTDL và GT 8
Bài tập CTDL và GT 8
Bài tập CTDL và GT 8

Contenu connexe

Tendances

Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4Nguyễn Công Hoàng
 
Bai tap lam quen java
Bai tap lam quen javaBai tap lam quen java
Bai tap lam quen javaTuấn Bùi
 
Chuong 1.2 bai giai dap so
Chuong 1.2 bai giai   dap soChuong 1.2 bai giai   dap so
Chuong 1.2 bai giai dap sothanhyu
 
Bài tập ôn lập trình
Bài tập ôn lập trìnhBài tập ôn lập trình
Bài tập ôn lập trìnhThai Hoc Vu
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 3
Giáo trình Phân tích và thiết kế giải thuật - CHAP 3Giáo trình Phân tích và thiết kế giải thuật - CHAP 3
Giáo trình Phân tích và thiết kế giải thuật - CHAP 3Nguyễn Công Hoàng
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 6
Giáo trình Phân tích và thiết kế giải thuật - CHAP 6Giáo trình Phân tích và thiết kế giải thuật - CHAP 6
Giáo trình Phân tích và thiết kế giải thuật - CHAP 6Nguyễn Công Hoàng
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 5
Giáo trình Phân tích và thiết kế giải thuật - CHAP 5Giáo trình Phân tích và thiết kế giải thuật - CHAP 5
Giáo trình Phân tích và thiết kế giải thuật - CHAP 5Nguyễn Công Hoàng
 
Nmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inNmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inHuy Nguyễn
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2Nguyễn Công Hoàng
 
Phân tích một số thuật toán
Phân tích một số thuật toánPhân tích một số thuật toán
Phân tích một số thuật toánHồ Lợi
 
7007643 baitap xu_li_tin_hieu_so_6201
7007643 baitap xu_li_tin_hieu_so_62017007643 baitap xu_li_tin_hieu_so_6201
7007643 baitap xu_li_tin_hieu_so_6201mvminhdhbk
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1Nguyễn Công Hoàng
 
Nmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inNmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inHuy Nguyễn
 
Tom tat cong thuc xstk
Tom tat cong thuc xstkTom tat cong thuc xstk
Tom tat cong thuc xstkBích Anna
 

Tendances (20)

Thuat Toan
Thuat ToanThuat Toan
Thuat Toan
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
Giáo trình Phân tích và thiết kế giải thuật - CHAP 4
 
Bai tap lam quen java
Bai tap lam quen javaBai tap lam quen java
Bai tap lam quen java
 
Chuong 1.2 bai giai dap so
Chuong 1.2 bai giai   dap soChuong 1.2 bai giai   dap so
Chuong 1.2 bai giai dap so
 
Bài tập ôn lập trình
Bài tập ôn lập trìnhBài tập ôn lập trình
Bài tập ôn lập trình
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 3
Giáo trình Phân tích và thiết kế giải thuật - CHAP 3Giáo trình Phân tích và thiết kế giải thuật - CHAP 3
Giáo trình Phân tích và thiết kế giải thuật - CHAP 3
 
GV
GVGV
GV
 
Timkiem&sapxep
Timkiem&sapxepTimkiem&sapxep
Timkiem&sapxep
 
Đệ Quy, Quay Lui, Nhánh Cận
Đệ Quy, Quay Lui, Nhánh CậnĐệ Quy, Quay Lui, Nhánh Cận
Đệ Quy, Quay Lui, Nhánh Cận
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 6
Giáo trình Phân tích và thiết kế giải thuật - CHAP 6Giáo trình Phân tích và thiết kế giải thuật - CHAP 6
Giáo trình Phân tích và thiết kế giải thuật - CHAP 6
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 5
Giáo trình Phân tích và thiết kế giải thuật - CHAP 5Giáo trình Phân tích và thiết kế giải thuật - CHAP 5
Giáo trình Phân tích và thiết kế giải thuật - CHAP 5
 
Chuong 3
Chuong 3Chuong 3
Chuong 3
 
Lttt b11
Lttt b11Lttt b11
Lttt b11
 
Nmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_inNmlt c07 mang1_chieu_in
Nmlt c07 mang1_chieu_in
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
Giáo trình Phân tích và thiết kế giải thuật - CHAP 2
 
Phân tích một số thuật toán
Phân tích một số thuật toánPhân tích một số thuật toán
Phân tích một số thuật toán
 
7007643 baitap xu_li_tin_hieu_so_6201
7007643 baitap xu_li_tin_hieu_so_62017007643 baitap xu_li_tin_hieu_so_6201
7007643 baitap xu_li_tin_hieu_so_6201
 
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
Giáo trình Phân tích và thiết kế giải thuật - CHAP 1
 
Nmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_inNmlt c08 mang2_chieu_in
Nmlt c08 mang2_chieu_in
 
Tom tat cong thuc xstk
Tom tat cong thuc xstkTom tat cong thuc xstk
Tom tat cong thuc xstk
 

Similaire à Bài tập CTDL và GT 8 (20)

Tut5 solution
Tut5 solutionTut5 solution
Tut5 solution
 
Bai de quy
Bai de quyBai de quy
Bai de quy
 
Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3
 
Exercise array
Exercise arrayExercise array
Exercise array
 
Thuat Toan 2
Thuat Toan 2Thuat Toan 2
Thuat Toan 2
 
Ctdl C05
Ctdl C05Ctdl C05
Ctdl C05
 
Data Structures and Algorithms Gụidance
Data Structures and Algorithms GụidanceData Structures and Algorithms Gụidance
Data Structures and Algorithms Gụidance
 
Tut4 solution
Tut4 solutionTut4 solution
Tut4 solution
 
Sang tao4
Sang tao4Sang tao4
Sang tao4
 
Bai tap java
Bai tap javaBai tap java
Bai tap java
 
Nmlt C06 Ham
Nmlt C06 HamNmlt C06 Ham
Nmlt C06 Ham
 
Cpl test1%20key
Cpl test1%20keyCpl test1%20key
Cpl test1%20key
 
4-Optimization.pdf
4-Optimization.pdf4-Optimization.pdf
4-Optimization.pdf
 
Lesson08
Lesson08Lesson08
Lesson08
 
CHƯƠNG 2.pdf
CHƯƠNG 2.pdfCHƯƠNG 2.pdf
CHƯƠNG 2.pdf
 
Chuyen doi he so
Chuyen doi he soChuyen doi he so
Chuyen doi he so
 
Tut6 solution
Tut6 solutionTut6 solution
Tut6 solution
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
344444
344444344444
344444
 

Plus de Hồ Lợi

Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cHồ Lợi
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functionsHồ Lợi
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequyHồ Lợi
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignmentHồ Lợi
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapcHồ Lợi
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitapHồ Lợi
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhHồ Lợi
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Hồ Lợi
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++Hồ Lợi
 
Epc assignment
Epc assignmentEpc assignment
Epc assignmentHồ Lợi
 
Epc test practical
Epc test practicalEpc test practical
Epc test practicalHồ Lợi
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --thHồ Lợi
 

Plus de Hồ Lợi (20)

Xu ly chuoi
Xu ly chuoiXu ly chuoi
Xu ly chuoi
 
Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của c
 
T4
T4T4
T4
 
Nguyen lyoop
Nguyen lyoopNguyen lyoop
Nguyen lyoop
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functions
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequy
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignment
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapc
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitap
 
Gtrinh oop
Gtrinh oopGtrinh oop
Gtrinh oop
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
Giaotrinhbaitapkythuatlaptrinh
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++
 
File trong c_
File trong c_File trong c_
File trong c_
 
Epc assignment
Epc assignmentEpc assignment
Epc assignment
 
Epc test practical
Epc test practicalEpc test practical
Epc test practical
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --th
 
Dethi c++ -lt
Dethi c++ -ltDethi c++ -lt
Dethi c++ -lt
 
Debug trong c
Debug trong cDebug trong c
Debug trong c
 
D05 stl
D05 stlD05 stl
D05 stl
 

Bài tập CTDL và GT 8

  • 1. I. MẢNG MỘT CHIỀU 1. Xây dựng giải thuật và viết hàm nhập mảng bằng tay void nhapmang( int a[], int &n) { cout<<" Nhap so phan tu: "; cin>> n; for (int i=0;i<n;i++) { cout<< " a["<<i<<"]: "; cin>>a[i]; } } 2. Xây dựng giải thuật và viết hàm nhập mảng ngẫu nhiên #include<time.h> // thư viện dùng cho hàm srand(), random theo thời gian. #include<stdlib.h> //thư viện dùng cho hàm rand(), phát sinh số ngẫu nhiên. void nhap_random( int a[], int &n) { srand(time(0)); rand(); cout<<" Nhap so phan tu: "; cin>> n; for (int i=0;i<n;i++) { a[i]=rand()%100; // giá trị phần tử random trong khoảng 0- 99 } cout<<"n"; } 3. Xây dựng giải thuật và viết hàm nhập mảng đệ quy void nhap_de_quy(int *&a,int n) { if(n==0) return; nhap_de_quy(a,n-1); cout<<" Nhap a["<<n-1<<"]: "; cin>>a[n-1]; } 4. Xây dựng giải thuật và viết hàm xuất mảng void xuat_mang(int a[],int n) { cout<<" cac phan tu mang:nn"; for(int i=0; i<n; i++) cout<<a[i]<<" "; cout<<"n"; } 5. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong mảng một chiều n số nguyên int lon_nhat(int a[],int n)
  • 2. { int max=a[0]; for(int i=1; i<n; i++) max=(a[i]>max)?a[i]:max; return max; } 6. Xây dựng giải thuật và viết hàm tìm giá trị dương đầu tiêntrong mảng, không có trả về 0 int duong_dau(int a[],int n) { for(int i=0; i<n; i++) if(a[i]>0) return a[i]; return 0; } 7. Xây dựng giải thuật và viết hàm tìm số chẵn cuối cùng trong mảng, không có thì trả về 0 int chancuoi(int a[],int n) { for(int i=n-1; i>=0; i--) if(a[i]%2==0) return a[i]; return 0; } 8. Xây dựng giải thuật và viết hàm tìm vị trí của phần tử nhỏ nhất trong mảng int vt_min(int a[],int n) { int vtmin=0; for(int i=1; i<n; i++) if(a[vtmin]>a[i]) vtmin=i; return vtmin; } 9. Xây dựng giải thuật và viết hàm tìm vị trí của giá trị chẵn đầu tiêntrong mảng, không có thì trả về 0 int vt_chandau(int a[], int n) { for(int i=0; i<n; i++) if(a[i]%2==0) return i; return 0; }
  • 3. 10. Xây dựng giải thuật và viết hàm tìm vị trí số hoàn thiện cuối cùng trong mảng, không có trả về 0 int sohoanthien(int a) // hàm kiểm tra số hoàn thiện. { int tong=0; for(int i=1; i<=a/2; i++) if(a%i==0) tong = tong + i; if(tong==a) return 1; return 0; } int vt_hoanthiencuoi(int a[],int n) // hàm tìm vị tri số hoàn thiện. { for(int i=n-1; i>=0; i--) if(sohoanthien(a[i])==1) return i; return 0; } 11. Xây dựng giải thuật và viết hàm tìm vị trí dương nhỏ nhất trong mảng, không có trả về 0. int duongdau(const int a[], int n) // Hàm tìm pt dương đầu tiên { for(int i=0; i<n; i++) if(a[i]>0) return a[i]; return 0; } int vt_duongmin(const int a[], int n) //Hàm tìm vị trí của pt dương min { int vt, dmin=duongdau(a,n); if(dmin==0) return 0; for(int i=0; i<n; i++) if(a[i]>0 && a[i]<dmin) { dmin=a[i]; vt=i; } return vt; } 12. Xây dựng giải thuật và viết hàm tìm số nguyên tố đầu tiêntrong mảng, không có trả về 0. int ngto(int a) // hàm kiểm tra 1 số có phải là nguyên tố không {
  • 4. if(a>=2) { for(int i=2; i<=a/2; i++) if(a%i==0) return 0; return 1; } return 0; } int ngtodau(const int a[],int n) // hàm tìm số nguyên tố đầu tiên { for(int i=0; i<n; i++) if(ngto(a[i])==1) return a[i]; return 0; } 13. Xây dựng giải thuật và viết hàm tìm số nguyên tố lớn nhất trong mảng, không có trả về 0. int ngto(int a) { if(a>=2) { for(int i=2; i<=a/2; i++) if(a%i==0) return 0; return 1; } return 0; } int ngto_max(const int a[],int n) // hàm tìm số nguyên tố lớn nhất { int max=0; for(int i=0; i<n; i++) if(ngto(a[i])==1) { max=a[i]; break; } if(max==0) return 0; for(i=i+1;i<n; i++) if(ngto(a[i])==1 && a[i] > max) max=a[i]; return max; }
  • 5. 14. Xây dựng giải thuật và viết hàm tìm số hoàn thiệncuối cùng trong mảng, không có trả về 0. int sohoanthien(int a) // hàm kiểm tra số hoàn thiện. { int tong=0; for(int i=1; i<=a/2; i++) if(a%i==0) tong = tong + i; if(tong==a) return 1; return 0; } int pt_hoanthien_cuoi(int a[],int n) // hàm tìm pt hoàn thiện cuối { for(int i=n-1; i>=0; i--) if(sohoanthien(a[i])==1) return a[i]; return 0; } 15. Xây dựng giải thuật và viết hàm tìm số hoàn thiện nhỏ nhất trong mảng, không có trả về 0. int sohoanthien(int a) { int tong=0; for(int i=1; i<=a/2; i++) if(a%i==0) tong = tong + i; if(tong==a) return 1; return 0; } int hoanthien_min(const int a[], int n) { int min=0; for(int i=0; i<n; i++) if(sohoanthien(a[i])==1) { min=a[i]; break; } if(min==0) return 0; for(i=i+1;i<n; i++) if(sohoanthien(a[i])==1 && a[i]<min) min=a[i]; return min; }
  • 6. 16. Xây dựng giải thuật và viết hàm tìm giá trị chẵn nhỏ nhất trong mảng, không có trả về 0. int chan_min(const int a[],int n) { int min=0; for(int i=0; i<n; i++) if(a[i]%2==0) { min=a[i]; break; } if(min==0) return 0; for(i=i+1;i<n; i++) if(a[i]%2==0 && a[i]<min) min=a[i]; return min; } 17. Xây dựng giải thuật và viết hàm tìm vị trí có giá trị âm lớn nhất trong mảng, không có thì trả về -1. int vt_am_max(int a[],int n) { int vtmax=-1; for(int i=0; i<n; i++) if(a[i]<0) { vtmax = i; break; } if( vtmax==-1) return -1; for(i=i+1;i<n; i++) if(a[i]<0 && a[i]>a[vtmax]) vtmax=i; return vtmax; } 18. Xây dựng giải thuật và viết hàm tìm những phần tử trong mảng xa giá trị x nhất. void pt_xa_x_nhat(const int a[], int n, int x) { long kcxn= abs(a[0]-x); int j=0; for(int i=1; i<n; i++) if(abs(a[i]-x) > kcxn) { kcxn = abs(a[i]-x); j=i; }
  • 7. cout<<"n Nhung gia tri xa "<<x<<" nhat:n"; for(j; j<n; j++) if(abs(a[j]-x)==kcxn) cout<<setw(3)<<" "<<a[j]; cout<<"n"; } 19. Xây dựng giải thuật và viết hàm tìm vị trí trong mảng mà giá trị tại đó gần x nhất. void vt_gan_x_nhat(const int a[], int n, int x) { long kcxn= abs(a[0]-x); int j=0; for(int i=1; i<n; i++) if(abs(a[i]-x) < kcxn && abs(a[i]-x)!=0) { kcxn = abs(a[i]-x); j=i; } cout<<"n Nhung vi tri co pt gan "<<x<<" nhat:n"; for( j; j<n; j++) if(abs(a[j]-x)==kcxn) cout<<setw(3)<<" "<<j+1; cout<<"n"; } 20. Xây dựng giải thuật và viết hàm tìm đoạn [a,b] sao cho đoạn này chứa tất cả các giá trị trong mảng. void timdoan(const int a[], int n) { int min, max; min = max = a[0]; for (int i=1; i<n; i++) { max = (max<a[i])?a[i] : max; min = (min>a[i])?a[i] : min; } cout<< "n ["<<min<<","<<max<<"] la doan chua cac gia tri trong mang"<<endl; } 21. Xây dựng giải thuật và viết hàm tìm trong mảng giá trị đầu tiên lớn hơn 2010, không có trả về 0. int dautien(const int a[] , int n) { for( int i=0 ; i<n; i++) if(a[i]>2010) return a[i]; return 0; }
  • 8. 22. Xây dựng giải thuật và viết hàm tìm trong mảng giá trị đầu tiên nằm trong khoảng (X,Y) cho trước, không có thì trả về X. int dautientrongdoan(const int a[], int n, int x, int y) { for( int i=0; i<n; i++) if ( a[i] >= x && a[i] <= y ) return a[i]; return x; } 23. Xây dựng giải thuật và viết hàm tìm số chính phương đầu tiên trong mảng, không có thì trả về 0. int sochinhphuong(int a) { for (int i=1; i<=a/2; i++) if (i*i==a) return 1; return 0; } int chinhphuongdautien(const int a[], int n) { for (int i=0; i<n; i++) if (sochinhphuong(a[i])==1) return a[i]; return 0; } 24. Xây dựng giải thuật và viết hàm tìm một vị trí của phần tử đầu tiên có giá trị bằng tích hai phần tử lân cận, nếu mảng không tồn tại phần tử thỏa điều kiện trên thì trả về 0. int tichlancan(const int a[], int n) { for ( int i=1; i< n-1; i++) if (a[i]==((a[i-1])*a[i+1])) return i; return 0; } 25. Xây dựng giải thuật và viết hàm tìm giá trị đầu tiêntrong mảng thỏa tính chất số gánh không có thì trả về 0 ( ví dụ: 12321). int soganh(int n) { int t=n; if(n<=100) return 0; int du,dn=0; while (t!=0)
  • 9. { du=t%10; dn=dn*10+du; t=t/10 ; } if ( n==dn) return 1; return 0; } int timsoganh(const int a[], int n) { for ( int i=0; i<n; i++) if ( soganh(a[i]) == 1) return a[i]; return 0; } 26. Xây dựng giải thuật và viết hàm tìm giá trị đầu tiêncó chữ số đầu tiênlà chữ số lẻ trong mảng, không có thì trả về 0 ( ví dụ: 110). int cs_dau_le(int n) { if(n<10) // vì phải tìm cs đầu tiên nên pt return 0; // phải có từ hai số trở lên. while (n>=10) n=n/10; if (n%2==0) return 0; return 1; } int ledautien(const int a[], int n) { for(int i=0 ; i<n; i++) if (cs_dau_le(a[i])==1) return a[i]; return 0; } 27. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất toàn chữ số lẻ so với những số cùng thỏa điều kiện trong mảng, không có thì trả về 0. int toanchusole(int n) { int dv; while (n!=0) { dv = n % 10; if (dv % 2 == 0) return 0; n=n/10; }
  • 10. return 1; } int csle_max(const int a[], int n) { int max=0; for(int i=0 ; i<n; i++) if (toanchusole(a[i])==1) { max = a[i]; break; } if (max==0) return 0; for(i=i+1;i<n; i++) if (toanchusole(a[i])==1) max = (a[i]>max)?a[i]:max ; return max; } 28. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong mảng có dạng 2^k, so với những số cùng thỏa điều kiện, nếu mảng không có phần tử dạng 2^k thì trả về 0. int dang2k(int n) { if(n==1) // so 2^k la so sau k lan chia lay nguyen cho 2 thi bang 1 return 1; // va kq moi lan chia phan nguyen deu chan. while(n>=2) { if (n%2 != 0) return 0; n = n/2; } return 1; } int pt_2k_max(const int a[], int n) { int max=0; for(int i=0 ; i<n; i++) if (dang2k(a[i])==1) { max = a[i]; break; } if (max==0) return 0; for(i=i+1;i<n; i++) if (dang2k(a[i])==1) max = (a[i]>max)?a[i]:max; return max;
  • 11. } 29. Xây dựng giải thuật và viết hàm tìm số chẵn lớn nhất, nhỏ hơn mọi giá trị lẻ có trong mảng một chiều n số nguyên, nếu mảng chỉ chứa các phần tử lẻ hoặc chẵn thì return 0. int chanmax_lemin(const int a[],int n) { int min, max; max = min=0; for (int i=0; i<n; i++) if (a[i]%2!=0) { min = a[i]; break; } if(min==0) return 0; for (i=i+1 ; i<n; i++) if (a[i]%2 !=0 && min>a[i]) min = a[i]; //--------------------- for (int j=0; j<n; j++) if (a[j]%2==0 && a[j]<min) { max = a[j]; break; } if(max==0) return 0; for (j=j+1 ; j<n; j++) if (a[j]%2==0 && max<a[j] && a[j]<min) max = a[j]; return max; } 30. Xây dựng giải thuật và viết hàm tìm số nguyên tố nhỏ nhất, lớn hơn mọi giá trị có trong mảng. int ngtomin_max(const int a[], int n) { int max=a[0]; for( int i=1; i<n; i++) max=(a[i] > max) ?a[i] : max; for (int k=max+1; k > max; k++) if (ngto(k)==1) break; return k; } 31. Xây dựng giải thuật và viết hàm liệt kê các phần tử thuộc đoạn [x,y] cho trước trong mảng. void lietke_XY( const int a[], int n, int x, int y) {
  • 12. int dem=0; cout<<"n Cac pt trong doan ["<<x<<","<<y<<"]: "; for (int i=0; i<n; i++) if (a[i]>=x && a[i]<=y) { dem++; cout<<setw(3)<<a[i]; } if(dem==0) cout<<"n Khong co pt trong doan ["<<x<<","<<y<<"]: "; cout<<"n"; } 32. Xây dựng giải thuật và viết hàm liệt kê các số trong mảng một chiều thỏa điều kiện: lớn hơn trị tuyệt đối của số đứng liềnsau nó. void lietke(const int a[], int n) { int dem = 0; cout<<"n Cac pt lon hon tri tuyet doi cua pt lien sau: "; for ( int i=0; i<n; i++) if (a[i]>abs(a[i+1])) { dem++; cout<<setw(3)<<a[i]; } cout<<endl; if (dem == 0) cout<<" Mang co thu tu tang dan"<<endl; } 33. Xây dựng giải thuật và viết hàm tính tổng các phần tử trong mảng một chiều n số nguyên. int tong(const int a[], int n) { int s=0; for (int i=0; i<n; i++) { s+= a[i]; } return s; } 34. Xây dựng giải thuật và viết hàm tính tổng các phần tử dương trong mảng. int tong_pt_duong (const int a[], int n) { int s = 0; for (int i=0; i<n; i++) if (a[i]>0) { s+= a[i];
  • 13. } return s; } 35. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số đầu là lẻ trong mảng, vd: 15, 30, ... int cs_daule(int n) { if(n<10) return 0; while (n>=10) n=n/10; if (n%2==0) return 0; return 1; } int tongdaule(const int a[], int n) { int s=0; for (int i=0; i<n; i++) if (cs_daule(a[i])==1) s+= a[i]; return s; } 36. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số hàng chục là 5 trong mảng. int hangchuc5(int a) { a=abs(a); if(a<50) return 0; else { a=a/10; int c=a%10; if(c==5) return 1; return 0; } } int tong_hc5(const int a[], int n) { int s=0; for (int i=0; i<n; i++) if (hangchuc5(a[i])==1) s+=a[i]; return s;
  • 14. } 37. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn phần tử đứng liềntrước nó trong mảng. int tong_sau_truoc(const int a[], int n) { int s = 0 ; for (int i=1; i<n; i++) if (a[i]>a[i-1]) s+=a[i]; return s; } 38. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn giá trị tuyệt đối của phần tử đứng liềnsau nó. int tong_lien_sau(const int a[], int n) { int s=0; for (int i=0; i<n-1; i++) if ( a[i] > abs(a[i+1]) ) s+= a[i]; return s; } 39. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn phần tử xung quanh trong mảng. int tong_xungquanh(const int a[], int n) { int s=0; for (int i=0; i<n; i++) { if (i==0 && a[i]>a[i+1]) s+= a[i]; else if (i!=0 && a[i]>a[i+1] && a[i] > a[i-1]) s+= a[i]; else if (i==n-1 && a[i] > a[i-1]) s+= a[i]; } return s; } 40. Xây dựng giải thuật và viết hàm tính tổng các phần tử cực trị trong mảng. Phần tử cực trị là phần tử lớn hơn hoặc nhỏ hơn hai phần tử xung quanh. int tong_cuctri(const int a[], int n) { int s=0; for (int i= 0; i<n; i++) { if (i==0 && a[i]!=a[i+1])
  • 15. s += a[i]; else if (i==n-1 && a[i]!= a[i-1]) s += a[i]; else if ((a[i]<a[i+1] && a[i]<a[i-1]) || (a[i]>a[i+1] && a[i]>a[i-1]) ) s += a[i]; } return s; } 41. Xây dựng giải thuật và viết hàm tính tổng các phần tử là số chính phương trong mảng. int chinhphuong(int a) { for (int i=1; i<=a/2; i++) if (i*i == a) return 1; return 0; } int tong_chinh_phuong(const int a[], int n) { int s=0; for (int i= 0; i<n; i++) if (chinhphuong(a[i])==1) s+=a[i]; return s; } 42. Xây dựng giải thuật và viết hàm tính tổng các phần tử là số đối xứng trong mảng, vd:12321( số gánh ). int sodoixung(int n) { if(n<=100) return 0; int donvi, tam = n, sodn = 0; while(tam!=0) { donvi = tam%10; sodn = sodn*10 + donvi; tam = tam/10; } if (sodn == n) return 1; return 0; } int tong_dx(const int a[], int n) { int s=0; for (int i= 0; i<n; i++)
  • 16. if (sodoixung(a[i])==1) s += a[i]; return s; } 43. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số đầu là chẵn trong mảng. int sodauchan(int n) { while(n>=10) n=n/10; if (n%2 == 0) return 1; return 0; } int tong_dau_chan(const int a[], int n) { int s=0; for (int i= 0; i<n; i++) if (sodauchan(a[i])==1) { s += a[i]; } return s; } 44. Xây dựng giải thuật và viết hàm tính trung bình cộng các phần tử dương trong mảng. float tb_cong_sd(const int a[], int n) { int s=0; float dem=0; for (int i= 0; i<n; i++) if (a[i]>0) { s += a[i]; dem ++; } if (dem == 0) return 0; return s/dem; } 45. Xây dựng giải thuật và viết hàm tính trung bình cộng các số nguyên tố trong mảng. int songuyento(int n) { for(int i=2; i<= n/2; i++) if (n % i == 0)
  • 17. return 0; return 1; } float tb_so_ngto(const int a[], int n) { int s=0; float dem=0; for (int i= 0; i<n; i++) if (songuyento(a[i])==1) { s += a[i]; dem ++; } if (dem == 0) return 0; return s/dem; } 46. Xây dựng giải thuật và viết hàm tính trung bình cộng các phần tử trong mảng lớn hơn x. float tb_hon_x(const int a[], int n, int x) { int s=0; float dem=0; for (int i= 0; i<n; i++) if (a[i]>x) { s += a[i]; dem ++; } if (dem == 0) return 0; return s/dem; } 47. Xây dựng giải thuật và viết hàm tính khoảng cách trung bình giữacác phần tử trong mảng. float kc_tb(const int a[], int n) { int s=0; float y=0; for (int i= 0; i<n-1; i++) for (int j=i+1; j<n; j++) { s = s+ abs(a[i]-a[j]); y++; } return s/y; } 48. Xây dựng giải thuật và viết hàm đếm số lượng phần tử chẵn có trong mảng một chiều n số nguyên. int demsochan(const int a[], int n) {
  • 18. int dem = 0; for (int i=0; i<n; i++) if (a[i]%2 == 0) dem ++; return dem; } 49. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử dương chia hết cho 7 trong mảng. int dem_duong_7(const int a[], int n) { int dem = 0; for (int i=0; i<n; i++) if (a[i]>0 && a[i]%7 == 0) dem ++; return dem; } 50. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử thỏa tính chất số gánh ( số đối xứng ) trong mảng. int sodx(int n) { if(n<=100) return 0; int donvi, tam = n; int sodn = 0; while(tam!=0) { donvi = tam%10; sodn= sodn*10 + donvi; tam = tam/10; } if (sodn == n) return 1; return 0; } int dem_dx (const int a[], int n) { int dem = 0; for (int i=0; i<n; i++) if (sodx (a[i])==1) dem ++; return dem; } 51. Xây dựng giải thuật và viết hàm đếm số lần xuất hiện của giá trị X trong mảng. int dem_x (const int a[], int n, int x) { int dem = 0; for (int i=0; i<n; i++)
  • 19. if (a[i] ==x) dem ++; return dem; } 52. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử có chữ số tận cùng bằng 5 trong mảng. int dem_cuoi_5 (const int a[], int n) { int dem = 0; for (int i=0; i<n; i++) if (a[i]%10 == 5) dem ++; return dem; } 53. Xây dựng giải thuật và viết hàm cho biết sự tương quan giữa số lượng chẵn và lẻ trong mảng, hàm trả về một trong ba giá trị: -1, 0, 1. -1 là lẻ nhiều hơn chẵn; 0 là chẵn bằng lẻ; 1 là chẵn nhiều hơn lẻ. int sosanh_chanle(const int a[], int n) { int demchan = 0; for (int i=0; i<n; i++) if (a[i]%2 == 0) demchan++; if (demchan > n - demchan) return -1; else if (demchan== n - demchan) return 0; else return 1; } 54. Xây dựng giải thuật và viết hàm đếm phần tử cùng lớn hơn hoặc nhỏ hơn các phần tử xung quanh trong mảng ( đếm phần tử cực trị ). int demcuctri(const int a[], int n) { int i , tam=0; for (i=0; i<n; i++) { if (i==0 && a[i]!=a[i+1]) tam++; else if ( i==n-1 && a[i]!=a[i-1]) tam++; else if ((a[i-1]>a[i] && a[i]<a[i+1]) || (a[i-1]<a[i] && a[i]>a[i+1])) tam++; } return tam; }
  • 20. 55. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử là số nguyên tố trong mảng. int so_ngto(int a) { if (a>=2) { for (int i=2; i<=a/2; i++) if (a%i==0) return 0; return 1; } return 0; } int dem_ngto(const int a[], int n) { int i, dem=0; for (i=0; i<n; i++) if (so_ngto(a[i])==1) dem++; return dem; } 56. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử là số hoàn thiện trong mảng. int kt_hoanthien(int n) { int tong=0; for (int i=1 ; i<= n/2; i++) if(n%i==0) tong = tong + i; if (tong == n) return 1; return 0; } int dem_hoanthien(const int a[], int n) { int i=0, dem=0; for (i=0; i<n; i++) if (kt_hoanthien(a[i])==1) dem++; return dem; }
  • 21. 57. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử lớn nhất trong mảng. int dem_max(const int a[], int n) { int i, dem=0; int max = a[0]; for (i=0; i<n; i++) { if (max == a[i]) dem++; else if (max < a[i]) { max = a[i]; dem = 1; } } return dem; } 58. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau mà cả hai đều là chẵn (kề trước hoặc kề sau và chẵn). int dem_ke_chan(const int a[], int n) { int i, dem=0; for (i=1; i<n; i++) if (a[i]%2==0 && a[i+1]%2==0 || a[i]%2==0 && a[i-1]%2==0) dem++; return dem; } 59. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau mà cả hai trái dấu nhau ( kề trước hoặc kề sau và trái dấu). int dem_traidau(const int a[], int n) { int i, dem=0; for (i=1; i<n; i++) if (a[i]*a[i+1]<0 || a[i]*a[i-1]<0) dem++; return dem; } 60. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau, mà số đứng trước cùng dấu với số đứng sau và có giá trị tuyệt đối nhỏ hơn trị tuyệt đối của số đứng sau. int dem_cungdau_nho(const int a[], int n) { int i, dem=0; for (i=0; i<n; i++) if (a[i]*a[i+1]>0 && abs(a[i])<abs(a[i+1])) dem++; return dem;
  • 22. } 61. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử có giá trị phân biệt trong mảng. int dem_pb(const int a[], int n) { int i, j, dem=0, test; for (i=0; i<n; i++) { for (test=1, j=i+1; j<n; j++) if (a[i]==a[j]) { test =0; break; } if (test == 1) dem++; } return dem; } 62. Xây dựng giải thuật và viết hàm liệt kê tần suất xuất hiện của các phần tử trong mảng, mỗi phần tử liệt kê một lần. void lietke_lan_xh(const int a[], int n) { for (int i=0; i<n; i++) { for (int dem=0, j=0; j<n; j++) if (a[i] == a[j]) { if (j<i) break; else dem++; } if (dem!=0 ) cout<<"n Gia tri "<<a[i]<<" co tan suat xuat hien la: "<<dem<<endl ; } } 63. Xây dựng giải thuật và viết hàm liệt kê các phần tử chỉ xuất hiện đúng một lần trong mảng. void lk_mot_lan(const int a[], int n) { int c[100]; int dem[100]; int vt = 0; for (int i=0; i<n; i++) {
  • 23. for (int demtam=0, j=0; j<n; j++) if (a[i] == a[j]) { if (j<i) break; else demtam++; } if (demtam!=0 ) { c[vt] = a[i]; dem[vt] = demtam; vt++; } } cout<<"n Gia tri chi xuat hien dung 1 lan:n"; for (int k=0; k<vt; k++) if (dem[k] == 1) cout<<setw(3)<<c[k]<<" "; cout<<endl; } 64. Xây dựng giải thuật và viết hàm liệt kê các phần tử xuất hiện quá một lần trong mảng, mỗi phần tử liệt kê một lần. void lk_hon_motlan(const int a[], int n) { int c[100]; int dem[100]; int vt = 0; for (int i=0; i<n; i++) { for (int demtam=0, j=0; j<n; j++) if (a[i] == a[j]) { if (j<i) break; else demtam++; } if (demtam!=0 ) { c[vt] = a[i]; dem[vt] = demtam; vt++; } } cout<<"n Gia tri xuat hien qua mot lan:n"; for (int k=0; k<vt; k++) if (dem[k] != 1) cout<<c[k]<<" "; cout<<endl; }
  • 24. 65. Cho hai mảng a, b. Xây dựng giải thuật và viết hàm đếm số lượng phần tử chỉ xuất hiện một trong hai mảng. int dem(const int a[], const int b[], int na, int nb) { int i, j, test, dem=0; for (i=0; i<na; i++) { test=1; for (j=0; j<nb; j++) if (a[i]==b[j]) { test = 0; break; } if (test==1) dem++; } for (i=0;i<nb;i++) { test=1; for (j=0; j<na;j++) if (b[i]==a[j]) { test=0;break; } if (test==1) dem++; } return dem; } 66. Cho hai mảng a, b. Xây dựng giải thuật và viết hàm cho biết số lần xuất hiện của mảng a trong mảng b. int dem_a_trong_b(const int a[],const int b[], int na, int nb) { int i, j, h, test, dem=0; for (i=0; i<nb; i++) if (b[i]==a[0] && nb-i>=na) { h=i; for (test=1, j=0; j<na; j++,h++) if (a[j] != b[h]) { test=0; break; } if (test==1) dem++; } return dem; } 67. Xây dựng giải thuật và viết hàm tìm một giá trị có số lần xuất hiện nhiều nhất trong mảng. int gt_xh_max(const int a[], int n) {
  • 25. int flag[100]={0}, i, j, dem; for (i=0; i<n ; i++) if (flag[i]==0) for (dem=0, j=0; j<n; j++) if (a[i] == a[j]) flag[j] = dem++; int xh_max = flag[0], vt=0; for (i=1; i<n; i++) if (xh_max < flag[i]) { xh_max = flag[i]; vt = i; } return a[vt]; } 68. Xây dựng giải thuật và viết hàm đếm số lượng phần tử nguyên tố phân biêt trong mảng. int kt_ngto(int a) { if (a>=2) { for (int i=2; i<a; i++) if (a%i==0) return 0; return 1; } return 0; } int dem_ngto_pb (const int a[], int n) { int i, j, test, dem=0; for (i=0; i<n; i++) { if (kt_ngto(a[i])==1) for (test=1, j=i+1; j<n; j++) if (a[i] == a[j] ) { test =0; break; } if (test == 1) dem++; } return dem; }
  • 26. 69. Xây dựng giải thuật và viết hàm kiểm tra mảng có phần tử chẵn hay không? có trả về 1, không có trả về 0. int kiemtrachan(const int a[] , int n) { int flag = 0; // khong co pt chan for(int i=0 ; i<n ;i++) if(a[i]%2 == 0) { flag = 1; return flag; } return flag; } 70. Xây dựng giải thuật và viết hàm kiểm tra mảng có tồn tại hai phần tử kề nhau, không mang giá trị liêntiếp int kt_hai_lientiep(const int a[], int n) { int flag; for(int i=0; i<n-1; i++) { flag=1; // mang co 2 pt thoa yeu cau for(int j=i+1; j<n; j++) { if( (a[i]+1) ==a[j] || (a[i]-1) == a[j]) { flag=0; break;} else return flag; } } return flag; } 71. Xây dựng giải thuật và viết hàm kiểm tra mảng có số nguyên tố hay không? có trả về 1, không có trả về 0. int xd_ngto(int a) { if (a<=1) return 0; for (int i=2; i<a; i++) if (a%i==0) return 0; return 1; } int kt_ngto_mang(const int a[] , int n) {
  • 27. int flag = 0; for(int i=0 ; i<n ;i++) if(xd_ngto(a[i]) == 1) { flag = 1; return flag; } return flag; } 72. Xây dựng giải thuật và viết hàm kiểm tra mảng có thỏa tính chất: không có số hoàn thiện lớn hơn 256. Thỏa trả về 1, không thỏa trả về 0. int hoan_thien(int n) { int tong=0; for (int i=1 ; i<n/2; i++) if(n%i==0) tong = tong + i; if (tong == n) return 1; return 0; } int kt_tinhchat(const int a[] , int n) { int flag = 1; // mang thoa tinh chat bai cho for(int i=0 ; i<n ;i++) if(hoan_thien(a[i])==1 && a[i] > 256) { flag = 0; return flag; } return flag; } 73. Xây dựng giải thuật và viết hàm kiểm tra mảng có toàn số chẵn hay không? có trả về 1, không có trả về 0. int kt_toanchan(const int a[] , int n) { int flag = 1; for(int i=0 ; i<n ;i++) if(a[i]%2!=0) { flag = 0; return flag; } return flag; }
  • 28. 74. Xây dựng giải thuật và viết hàm kiểm tra mảng có đối xứng không? có trả về 1, không có trả về 0. int kt_doixung(const int a[] , int n) { int flag = 1; for(int i=0 ; i<n/2 ; i++) if(a[i] != a[n-i-1]) { flag = 0; return flag; } return flag; } 75. Xây dựng giải thuật và viết hàm kiểm tra mảng có tính chẵn lẻ không? có trả về 1, không trả về 0. Mảng có tính chẵn lẻ là mảng có tổng hai phần tử liêntiếp luôn là lẻ. int kt_tinh_chanle(const int a[] , int n) { int flag = 1; for(int i=0 ; i<n-1 ;i++) if( (a[i]+a[i+1])%2==0) { flag = 0; return flag; } return flag; } 76. Xây dựng giải thuật và viết hàm kiểm tra mảng có tăng dần hay không? tăng trả về 1, không tăng trả về 0. int kt_tangdan(const int a[] , int n) { int flag = 1; for(int i=0 ; i<n-1 ; i++) if(a[i] > a[i+1]) { flag = 0; return flag; } return flag; } 77. Xây dựng giải thuật và viết hàm kiểm tra các phần tử trong mảng có lập thành cấp số cộng hay không? Nếu có chỉ ra công sai d, nếu không trả về 0. int kt_capsocong(const int a[] , int n , int &d) { d = a[1] - a[0]; int flag = 1; for(int i=2 ; i<n-1 ;i++) if( (a[i+1] - a[i])!=d)
  • 29. { flag = 0; return flag; } return flag; } 78. Xây dựng giải thuật và viết hàm kiểm tra các phần tử trong mảng có bằng nhau không? bằng nhau trả về 1, không bằng nhau trả về 0. int kt_bangnhau(const int a[] , int n) { int flag; for(int i = 0 ; i <n-1 ; i++) { flag = 0; for(int j = i+1 ; j<n ; j++) if(a[i] == a[j]) { flag = 1; break; } } return flag; } 79. Xây dựng giải thuật và viết hàm kiểm tra mảng có dạng sóng hay không? có trả về 1, không trả về 0. Một mảng có dạng sóng là mảng có các phần tử thứ i lớn hơn hoặc nhỏ hơn hai phần tử xung quanh. int kt_dangsong(const int a[] , int n) { int flag = 1; for(int i = 1 ; i < n-1 ; i++) if( (a[i-1] > a[i] && a[i] > a[i+1]) || (a[i-1] < a[i] && a[i] < a[i+1]) ) { flag = 0; return flag; } return flag; } 80. Hãy cho biết tất cả các phần tử trong mảng a có nằm trong mảng b không? có trả về 1, không có trả về 0. int ktA_trong_B(const int a[] ,const int b[] , int n , int m) { int flag = 0; int dem = 0; for(int i = 0 ; i < n ; i++) for(int j = 0 ; j < m ;j++) if(a[i] == b[j]) { dem++; break; } if(dem == n) flag = 1;
  • 30. return flag; } 81. Xây dựng giải thuật và viết hàm đếm giá trị trong mảng thỏa điều kiện: lớn hơn tất cả các giá trị đứng trước nó. int dem_pt_lon_sau(const int a[] , int n) { int dem = 0; for(int i = 1 ; i < n ; i++) { int flag = 1; for(int j = 0; j < i ; j++) if( a[i] <= a[j] ) { flag = 0; break; } if(flag == 1) dem++; } return dem; } 82. Xây dựng giải thuật và viết hàm sắp xếp mảng một chiều n số nguyên theo thứ tự tăng dần. void sx_tang(int a[], int n) { int tg, i, j, min; for(i=0;i<n-1; i++) { min=i; for(j=i+1;j<n; j++) { if(a[min]>a[j]) min=j; } tg=a[min]; a[min]=a[i]; a[i]=tg; } } 83. Xây dựng giải thuật và viết hàm sắp xếp phần tử lẻ tăng dần, các phần tử khác giữ nguyên vị trí. + Yêu cầu: Sắp xếp các phần tử lẻ theo thứ tự tăng dần các phần tử khác giữ nguyên vị void sx_le_tang(int a[],int n) { for (int i=0; i<n-1; i++) if (a[i]%2!=0) for (int j=i+1; j<n; j++) if (a[j]%2!=0 && a[i]>a[j]) { int tg=a[i];
  • 31. a[i] = a[j]; a[j]=tg; } } 84. Xây dựng giải thuật và viết hàm sắp xếp số nguyên tố tăng dần, các phần tử khác giữ nguyên vị trí. int SoNguyenTo(int a) { if (a<=1) return 0; for (int i=2; i<=a/2; i++) if (a%i==0) return 0; return 1; } void sx_ngto_tang(int a[],int n) { for (int i=0; i<n-1; i++) if (SoNguyenTo (a[i] ) ==1) for (int j=i+1; j<n; j++) if (SoNguyenTo (a[j] ) ==1 && a[i]>a[j]) { int tg=a[i]; a[i] = a[j]; a[j]=tg; } } 85. Xây dựng giải thuật và viết hàm sắp xếp số hoàn thiện giảm dần, các phần tử khác giữ nguyên vị trí. int so_hoanthien(int n) { int tong=0; for (int i=1; i<=n/2; i++) if(n%i==0) tong = tong + i; if (tong == n) return 1; return 0; } void sx_hoanthien_giam(int a[],int n) { for (int i=0; i<n-1; i++) if (so_hoanthien (a[i] ) ==1) for (int j=i+1;j<n;j++) if (so_hoanthien (a[j] ) ==1 && a[i]<a[j]) { int temp=a[i];
  • 32. a[i] = a[j]; a[j]=temp; } } 86. Cho hai mảng a, b. Xây dựng giải thuật và viết hàm cho biết mảng b có phải là hoán vị của mảng a hay không. void sapxep(int a[],int n) { for (int i=0; i<n-1; i++) for (int j=i+1; j<n; j++) if (a[i]>a[j]) { int temp=a[i]; a[i] = a[j]; a[j]=temp; } } void KetQua(int a[],int b[],int na,int nb) { if (na != nb) { cout<<"n mang b ko phai là hoan vi cua mang a!"<<endl; return ; } sapxep(a, na); sapxep(b, nb); for (int i=0; i<na; i++) if (a[i]!=b[i]) { cout<<"n mang b ko phai la hoan vi cua mang a!"<<endl; return; } cout<<"n mang b la hoan vi cua mang a!"<<endl; return; } 87. Xây dựng giải thuật và viết hàm sắp xếp các số dương tăng dần, các số âm giữ nguyên vị trí. void sx_duong_tang(int a[],int n) { for (int i=0; i<n-1; i++) if (a[i]>0) for (int j=i+1; j<n; j++) if (a[j]>0 && a[i]>a[j]) { int temp=a[i]; a[i] = a[j]; a[j]=temp; }
  • 33. } 88. Xây dựng giải thuật và viết hàm sắp xếp chẵn, lẻ tăng dần nhưng giữ vị trí tương đối giữa các phần tử chẵn và lẻ. void sx_chanle_tang( int a[],int n ) { for (int i=0; i<n-1; i++) for (int j=i+1; j<n; j++) if (( (a[i]%2==0 && a[j]%2==0) ||(a[i]%2!=0 && a[j]%2!=0)) && a[i]>a[j]) { int tg=a[i]; a[i] = a[j]; a[j]=tg; } } 89. Xây dựng giải thuật và viết hàm sắp xếp số dương tăng dần, số âm giảm dần, vị trí tương đối không thay đổi. void sx_duongtang_amgiam(int a[], int n) { for (int i=0; i<n-1; i++) for (int j=i+1; j<n; j++) { if (a[i]>0 && a[j]>0 && a[i]>a[j]) { int tg=a[i]; a[i] = a[j]; a[j]=tg; } else if (a[i]<0 && a[j]<0 && a[i]<a[j]) { int tg=a[i]; a[i] = a[j]; a[j]=tg; } } } 90. Cho hai mảng a, b. Xây dựng giải thuật và viết hàm trộn hai mảng thành một mảng giảm dần. void tron_mang_giam(int a[], int b[], int c[], int na, int nb, int &nc) { sapxep(a,na); //Sap xep tang mang A sapxep(b,nb); //Sap xep tang mang B; hàm sapxep ở đầu kỹ thuật sx. nc = na + nb; int vta= na-1,vtb= nb-1; for (int i=0; i<nc; i++) { if (vta >=0&& vtb >= 0) { if (a[vta] > b[vtb]) { c[i] = a[vta]; vta--; } else { c[i] = b[vtb]; vtb--; }
  • 34. } else if (vtb < 0) { c[i] = a[vta]; vta--; } else { c[i] = b[vtb]; vtb--; } } } 91. Xây dựng giải thuật và viết hàm thêm một phần tử x vào vị trí k trong mảng một chiều n số nguyên. void them_gt_x(int a[], int &n, int x, int k) { if( k>=n) { a[n]=x; n++; return; } for (int i=n; i>k; i--) a[i] = a[i-1]; a[k] = x; n++; } 92. Xây dựng giải thuật và viết hàm thêm phần tử x vào trong mảng tăng nhưng vẫn giữ nguyên tính tăng của mảng. void them_x_mangtang(int a[], int &n, int x) { int dem=0; for (int i=0; i<n;i++) if (a[i]>x) { dem=1; for (int k = n; k>i; k--) a[k] = a[k-1]; a[i] = x; break; } if(dem==0) a[n]=x; n++; } 93. Xây dựng giải thuật và viết hàm thêm phần tử x vào sau phần tử là số nguyên tố đầu tiêntrong mảng, nếu không có phần tử nguyên tố thì thêm vào cuối mảng. int kt_ngto(int a) {
  • 35. if (a<=1) return 0; for (int i=2; i<=a/2; i++) if (a%i==0) return 0; return 1; } void them_x_sau_ngto(int a[], int &n, int x) { int dem=0; for (int i=0; i<n; i++) if (kt_ngto(a[i])==1) { dem++; i=i+1; for (int k = n; k>i; k--) a[k] = a[k-1]; a[i] = x; break; } if(dem==0) a[n]=x; n++; } 94. Xây dựng giải thuật và viết hàm xóa phần tử có chỉ số k trong mảng một chiều n số nguyên. void xoa_pt_k(int a[], int &n, int k) { for(int i=k; i<n;i++) a[i] = a[i+1]; n--; } 95. Hãy xóa tất cả các phần tử lớn nhất trong mảng. int tim_max(int a[], int n) { int max = a[0]; for (int i=1; i<n ; i++) { max=(max<a[i])?a[i]:max; } return max; } void xoa_pts_max(int a[], int &n) { int max=tim_max(a,n); for (int i=0; i<n; i++) if (a[i]==max) { for (int k=i; k<n; k++) a[k] = a[k+1]; n--;
  • 36. } } 96. Xây dựng giải thuật và viết hàm xóa tất cả các số chẵn trong mảng. void xoa_pts_chan(int a[], int &n) { for (int i=0; i<n; i++) if (a[i]%2==0) { for (int k=i; k<n; k++) a[k] = a[k+1]; n--; } } 97. Xây dựng giải thuật và viết hàm xóa tất cả các số chính phương trong mảng. int so_chinhphuong(int n) { for (int i=1; i<=n/2; i++) if (i*i == n) return 1; return 0; } void xoa_pts_cp(int a[], int &n) { for (int i=0; i<n; i++) if (so_chinhphuong(a[i])==1) { for (int k=i; k<n; k++) a[k] = a[k+1]; n--; } } 98. Xây dựng giải thuật và viết hàm xóa tất cả các số trùng với x trong mảng. void xoa_pts_x(int a[], int &n, int x) { for (int i=0; i<n; i++) if (a[i]==x) { for (int k=i; k<n; k++) a[k] = a[k+1]; n--; } }
  • 37. 99. Xây dựng giải thuật và viết hàm xóa tất cả các số nguyên tố trong mảng. int so_nguyento(int n) { if(n>=2) { for (int i=2; i<=n/2; i++) if (n%i==0) return 0; return 1; } return 0; } void xoa_ngto(int a[], int &n) { for(int i=0; i<n; i++) if (so_nguyento(a[i])==1) { for (int k=i; k<n; k++) a[k]=a[k+1]; n--; } } 100. Xây dựng giải thuật và viết hàm xóa tất cả các phần tử trùng nhau trong mảng và chỉ giữ lại duy nhất một phần tử. void xoa_pts_trung(int a[], int &n) { for (int i=0; i<n-1; i++) for(int j=i+1; j<n; j++) if (a[i]==a[j]) { for (int k=j; k<n; k++) a[k]=a[k+1]; n--; } } 101. Xây dựng giải thuật và viết hàm xóa tất cả các phần tử xuất hiện nhiều hơn một lần trong mảng. void xoa_pts_hon1(int a[], int &n) { for (int i=0; i<n-1; i++) { for(int test = 0, j=i+1; j<n; j++) //xóa ptu tai j if (a[i]==a[j])
  • 38. { for (int k=j; k<n; k++) a[k] = a[k+1]; n--; j--; test=1; } if (test == 1) //Xóa luôn chính nó { for (int k=i; k<n; k++) a[k] = a[k+1]; n--; i--; } } } 102. Xây dựng giải thuật và viết hàm đưa số 1 về đầu mảng. void duaMotvedau(int a[], int n) { for (int i=1; i<n; i++) if (a[i] == 1) { int tg=a[i]; for(int k=i ; k>0; k--) a[k] = a[k-1]; a[0] = tg; } } 103. Xây dựng giải thuật và viết hàm đưa chẵn về đầu, lẻ về cuối, phần tử 0 nằm giữa mảng. void sx_chandau_0_lecuoi(int a[], int n) { int i; int vtle=0; for (i=1; i<n; i++) if (a[i] %2 == 0 && a[i]!=0 || a[0]==0) { int tg=a[i]; for(int k=i ; k>0; k--) a[k] = a[k-1]; a[0] = tg; } int dem=0; for (i=0; i<n; i++) { if (dem==0 && a[i]%2!=0) { vtle = i; dem=1; }
  • 39. if(a[i]==0 && vtle==0) continue; else if (a[i]==0) { for(int k=i ; k>vtle; k--) a[k] = a[k-1]; a[vtle] =0; } } } 104. Xây dựng giải thuật và viết hàm đưa các số chia hết cho 3 về đầu mảng. void chiahetchoba(int a[], int n) { for (int i=1; i<n; i++) if (a[i] %3 == 0) { int tg = a[i]; for(int k = i ; k>0; k--) a[k] = a[k-1]; a[0] = tg; } } 105. Xây dựng giải thuật và viết hàm đảo ngược mảng ban đầu. void dao_nguoc(int a[], int n) { for (int i=0, j=n-1; i<j; i++, j--) { int tg=a[i]; a[i]=a[j]; a[j]=tg; } } 106. Xây dựng giải thuật và viết hàm đảo ngược thứ tự các số chẵn trong mảng. void daochan(int a[], int n) { for (int i=0; i<n-1; i++) for (int j = i+1; j<n; j++) if (a[j]%2==0 &&a[i] %2 == 0) { int tg=a[i]; a[i]=a[j]; a[j]=tg; } } 107. Xây dựng giải thuật và viết hàm dịch trái các phần tử trong mảng. void dichtrai(int a[], int n) { int tg = a[0]; for (int i=0; i<n-1; i++) a[i]=a[i+1];
  • 40. a[n-1]= tg; } 108. Xây dựng giải thuật và viết hàm xuất mảng: chẵn nằm 1 hàng, lẻ nằm hàng tiếptheo. void chanle_haihang(const int a[], int n) { cout<<"n Cac pt chan: " ; for (int i=0; i<n; i++) if (a[i]%2==0) { cout<<setw(3)<<a[i]; } cout<<"n Cac pt le: "; for (i=0; i<n; i++) if (a[i]%2!=0) { cout<<setw(3)<<a[i]; } } 109. Xây dựng giải thuật và viết hàm đảo thứ tự số chẵn, lẻ trong mảng nhưng vẫn giữ vị trí tương đối. void hoanvi(int &a, int &b) { int temp = a; a = b; b = temp; } void daonguoc_chanle(int a[], int n) { int i, j; for (i=0; i<n-1; i++) for(j=i+1;j<n; j++) { if (a[i]%2==0 && a[j]%2 == 0) hoanvi(a[i],a[j]); else if (a[i]%2!=0 && a[j]%2!=0) hoanvi(a[i],a[j]); } } 110. Xây dựng giải thuật và viết hàm biến đổi mảng bằng cách thay giá trị max = giá trị minvà ngược lại. void minmax(int a[], int n, int &max, int &min) { max= min= a[0]; for (int i=1; i<n; i++) {
  • 41. max=(max<a[i])?a[i]:max; min=(min>a[i])?a[i]:min; } } void biendoi(int a[], int n) { int max,min; minmax(a, n, max, min); for(int i=0; i<n; i++) { if (a[i]==max) a[i]=min; else if (a[i]==min) a[i]=max; } } 111. Xây dựng giải thuật và viết hàm liệt kê tất cả các mảng con có độ dài hơn 2 phần tử. void xuatmangcon(const int b[], int nb) { for(int i=0; i<nb; i++) cout<<setw(4)<<b[i]; cout<<endl; } void lk_mang_hon2(const int a[], int n) { int b[100], nb, d; for (int i=0; i<n-1; i++) for (d = i+3; d<=n; d++) { nb=0; b[0]=a[i]; nb++; for(int j=i+1; j<d; j++) { b[nb]=a[j]; nb++; } xuatmangcon(b,nb); cout<<endl; while(nb>3) { for(int m=1; m<nb; m++) b[m]=b[m+1]; nb--; xuatmangcon(b,nb); cout<<endl; } } }
  • 42. 112. Xây dựng giải thuật và viết hàm liệt kê tất cả các mảng con tăng dần trong mảng. void lk_mangcon_tang(const int a[], int n) { int b[100], nb, d; for (int i=0; i<n-1; i++) for (d = i+2; d<=n; d++) { nb=0; b[0]=a[i]; nb++; int co=0; for(int j=i+1; j<d; j++) { if(a[j]>b[nb-1]) { co=1; b[nb]=a[j]; nb++; } else if(nb!=1 && a[j]<b[0]) co=0; else if(nb!=1 && a[j]<b[nb-1] && a[j]>b[0]) { co=1; for(int k=1; k<nb; k++) if(b[k]>a[j]) { b[k]=a[j]; break; } while(nb>k+1) nb--; } } if(co!=0) { xuatmangcon(b,nb); cout<<endl; while(nb>2) { for(int m=1; m<nb; m++) b[m]=b[m+1]; nb--; xuatmangcon(b,nb); cout<<endl; } } } } 113. Xây dựng giải thuật và viết hàm liệt kê tất cả mảng con tăng và có chứa giá trị lớn nhất trong mảng. void lk_mangcon_tangmax(const int a[], int n) { int b[100], nb, d, max=a[0]; for(int k=1; k<n; k++) max=(a[k]>max)?a[k]:max; for (int i=0; i<n-1; i++)
  • 43. for (d = i+2; d<=n; d++) { nb=0; b[0]=a[i]; nb++; int co=0; for(int j=i+1; j<d; j++) { if(a[j]>b[nb-1]) { co=1; b[nb]=a[j]; nb++; } else if(nb!=1 && a[j]<b[0]) co=0; else if(nb!=1 && a[j]<b[nb-1] && a[j]>b[0]) { co=1; for(int k=1; k<nb; k++) if(b[k]>a[j]) { b[k]=a[j]; break; } while(nb>k+1) nb--; } } if(co!=0) { for(int m=0; m<nb; m++) if(b[m]==max) { xuatmangcon(b,nb); break; } if(kt_tang(b,nb)==1 &&nb>2) while(nb>2) { for(int m=1; m<nb; m++) b[m]=b[m+1]; nb--; for(int n=0; n<nb; n++) if(b[n]==max) { xuatmangcon(b,nb); break; } } } } } 114. Xây dựng giải thuật và viết hàm liêt kê tất cả mảng con tăng và tính tổng cho từng mảng con đó. int tongs(const int b[],int nb) { long s=0; for(int i=0; i<nb; i++) s+=b[i]; return s; }
  • 44. void lk_mangcon_tang_tong(const int a[], int n) { int b[100], nb, d; for (int i=0; i<n-1; i++) for (d = i+2; d<=n; d++) { nb=0; b[0]=a[i]; nb++; int co=0; for(int j=i+1; j<d; j++) { if(a[j]>b[nb-1]) { co=1; b[nb]=a[j]; nb++; } else if(nb!=1 && a[j]<b[0]) co=0; else if(nb!=1 && a[j]<b[nb-1] && a[j]>b[0]) { co=1; for(int k=1; k<nb; k++) if(b[k]>a[j]) { b[k]=a[j]; break; } while(nb>k+1) nb--; } } if(co!=0) { xuatmangcon(b,nb); int s=tongs(b,nb); cout<<"tt co tong la: "<<s<<endl; while(nb>2) { for(int m=1; m<nb; m++) b[m]=b[m+1]; nb--; xuatmangcon(b,nb); int s=tongs(b,nb); cout<<"tt co tong la: "<<s<<endl; } } } } 115. Xây dựng giải thuật và viết hàm đếm số mảng con tăng trong mảng ban đầu. int dem_mangcon_tang(const int a[], int n) { int b[100], nb, d, dem=0; for (int i=0; i<n-1; i++) for (d = i+2; d<=n; d++) {
  • 45. nb=0; b[0]=a[i]; nb++; int co=0; for(int j=i+1; j<d; j++) { if(a[j]>b[nb-1]) { co=1; b[nb]=a[j]; nb++; } else if(nb!=1 && a[j]<b[0]) co=0; else if(nb!=1 && a[j]<b[nb-1] && a[j]>b[0]) { co=1; for(int k=1; k<nb; k++) if(b[k]>a[j]) { b[k]=a[j]; break; } while(nb>k+1) nb--; } } if(co!=0) { dem++; while(nb>2) { for(int m=1; m<nb; m++) b[m]=b[m+1]; nb--; dem++; } } } return dem; } 116. Xây dựng giải thuật và viết hàm liệt kê tất cả mảng con toàn dương và có độ dài hơn 1. void lk_mangduong_hon1(const int a[], int n) { int b[100], nb, d; for (int i=0; i<n-1; i++) for (d = i+2; d<=n; d++) { int co=0; if(a[i]>0) { nb=0; b[0]=a[i]; nb++; for(int j=i+1; j<d; j++) {
  • 46. if(a[j]>0) { co=1; b[nb]=a[j]; nb++; } else if(a[j]<0) co=0; } } if(co!=0) { xuatmangcon(b,nb); cout<<endl; while(nb>2) { for(int m=1; m<nb; m++) b[m]=b[m+1]; nb--; xuatmangcon(b,nb); cout<<endl; } } } } 117. Xây dựng giải thuật và viết hàm tìm mảng con toàn dương có tổng lớn nhất. void mangduong_smax(const int a[], int n) { int b[100], nb, d; int max=0, s; for (int i=0; i<n-1; i++) for (d = i+2; d<=n; d++) { int co=0; if(a[i]>0) { nb=0; b[0]=a[i]; nb++; for(int j=i+1; j<d; j++) { if(a[j]>0) { co=1; b[nb]=a[j]; nb++; } else if(a[j]<0) co=0; } } if(co!=0) { int c[100], nc;
  • 47. s=tongs(b,nb); if(max<s) { max=s; nc=0; for(int k=0; k<nb; k++) { c[nc]=b[k]; nc++; } } else { xuatmangcon(c,nc); cout<<endl; return; } } } }
  • 48. II: DANH SÁCH LIÊN KẾT ĐƠN 118. Cấu trúc dữ liệu Cấu trúc phần tử typedef struct tag_Node { int data; struct tag_Node *pNext; } Node; Cấu trúc danh sách các phần tử typedef struct tag_List { Node*pHead; Node*pTail; }List; 119. Xây dựng giải thuật và viết hàm xóa phần tử đầu int xoadau(List &l) { if ( l.pHead= =NULL) return 0; else { l.pHead=l.pHead->pNext; return 3; } } 120. Xây dựng giải thuật và viết hàm xóa phần tử cuối int xoa cuoi(List &l) { Node *k; If(l.pTail= =NULL) Return 0; Else { For(k=l.pHead;k->pNext!=pTail) K=k->pNext; k->pNext=NULL; l.pTail=k; return 3; } } 121. Xây dựng giải thuật và viết hàm xóa một phần tử đứng sau một phần tử x: Int xoa ptx(List &l,int x) { Node *p=tim x(l,x); If(l.pHead= =NULL)
  • 49. Return 0; If(p= =NULL) Return 1; If(p= =l.pTail) { Return 2; } Else { Node *k=p->pNext; Node *m=->pNext; p->pNext=m; } } 122. Xây dựng giải thuật và viết hàm xóa một phần tử đứng trước một phần tử x: Int xoapt_truoc x(List &l,int x) { Node *p=tim x(l,x); If(l.pHead= =NULL) Return 0; If(p= =NULL) Return 1; If(p= =l.pHead) Return 2; If(l.pHead->pNext= =p) { Xoadau(l); Return 3; } Else { Node *k=l.pHead; While(q->pNext!=k) q=q->pNext; q->pNext=p; return 4; } } 123. Xây dựng giải thuật và viết hàm xóa toàn bộ danh sách: Void xoa_toanbods(List &L) { Node* Temp = L.First; while (Temp!= NULL){ L.First = L.First ->Next; Temp ->Next = NULL;
  • 50. if (L.First != NULL) L.First ->Pre = NULL; delete Temp; Temp=L.First; } } 124. Xây dựng giải thuật và viết hàm xóa một phần tử x: int xoapt_Node (List &l, int x) { Node *p = l.pHead; while (p != NULL) { if (p->data== x) break; p = p->pNext; } 125. Xây dựng giải thuật và viết hàm xóa phần tử nhỏ nhất trong danh sách: 126. Xây dựng giải thuật và viết hàm xóa hai phần tử trước và sau X: 127. Xây dựng giải thuật và viết hàm liệt kê các số âm trong danh sách: void List_ke_so_am(List &l) { Node *p=l.pHead;int dem=0; while(p!=NULL) { if(p->data<0) { cout<<p->data<<" "; dem++; } p=p->pNext; } if(dem==0) cout<<"danh sach khong co so am"; } 128. Xây dựng giải thuật và viết hàm tìm phần tử có giá trị max trong danh sách: Node *timmax(List l) { Node *p=l.pHead; for(Node *k=l.pHead->pNext,k,k=k->pNext) { if(k->data<p->data) p=k; } cout<<"n gia tri max="<<p->data; cout<<"n ";
  • 51. return p; return NULL; } 129. Xây dựng giải thuật và viết hàm tìm phần tử có giá trị mintrong danh sách: Node *timmin(List l) { Node *p=l.pHead; for(Node *k=l.pHead->pNext,k;k=k->pNext) { if(k->data<p->data) k=p; } cout<<"n gia tri min="<<p->data; cout<<"n "; return p; return NULL; } 130. Xây dựng giải thuật và viết hàm tìm phần tử chẵn đầu trong danh sách: Node *tim_chan_dau(List l) { Node *p=l.pHead; while(p!=NULL) { if(p->data%2==0) { return p; break; } p=p->pNext; } return NULL; } 131. Xây dựng giải thuật và viết hàm tìm phần tử lẽ cuối cùng trong danh sách: Node *tim_le_cuoi(List l) { Node *p=l.pHead;Node *k=NULL; while(p!=NULL) { if(p->data%2!=0) { k=p; } p=p->pNext; } if(k!=NULL) return k;
  • 52. else return NULL; } 132. Xây dựng giải thuật và viết hàm tìm phần tử chẵn max lớn hơn lẽ max: void chanmax_max_minmax(LIST &l) { Node *cm = chanmax(l); Node *lm = lemax(l); if(cm->data < lm->data) cout<<"Khong thoa y/c! So chan lon nhat la: "<<cm->data<<" nho hon so le lon nhat la: "<<lm->data; if(cm->data > lm->data) cout<<"Thoa y/c! So chan lon nhat la: "<<cm->data<<" va so le lon nhat la: "<<lm->data; else if(cm->data == lm->data) cout<<"Khong thoa y/c! So chan lon nhat: "<<cm->data<<" bang so le lon nhat: "<<lm->data; } 133. Xây dựng giải thuật và viết hàm đếm nguyên tố trong danh sách int dem_so_nto(List l) { Node *k=l.pHead; int dem=0; for(k;k!=NULL;k=k->pNext) { if(ktsnt(k->data)==1) cout<<k->data<<" "; } } 134. Xây dựng giải thuật và viết hàm đếm số node int demsoNode(List l) { int dem=0; Node *p=l.pHead; While(q!=NULL) { Dem++; q=q->pNext; } Return dem; } 135. Xây dựng giải thuật và viết hàm đếm số phần tử chẵn: int demchan(List l) { int dem=0;
  • 53. Node *p; p=l.pHead; while(p) { if(p->data%2= = 0) dem++; p=p->pNext; } return dem; } 136. Xây dựng giải thuật và viết hàm đếm phần tử lẻ: Int demle(List l) { Int dem=0; Node *p; P=l.pHead; While(p) { If(p->data%2!=0) Dem++; p=p->pNext; } Return dem; } 137. Xây dựng giải thuật và viết hàm đếm số phần tử chia hết cho 2: Int ptu_chia2(list l) { int dem=0; Node *p; p=l.pHead; while(p) { if(p->data%2= =0) dem++; p=p->pNext; } return dem; } 138. Xây dựng giải thuật và viết hàm đếm số phần tử dương: int demduong(List l) { int dem=0; Node *p; p=l,pHead; while(p) {
  • 54. if(p->data>0) dem++; p=p->pNext; } return dem; } 139. Xây dựng giải thuật và viết hàm tìm các số chắn trong danh sách int kt_chan(int k) { int flag=0; if(k%2= =0) flag=1; return flag; } 140. Xây dựng giải thuật và viết hàm in ra các số chẵn void xuatchan(List l) { int flag=0; Node *; p=l.pHead; while(p) { if(kt_chan(p->data)= =1) { cout<<” “<<p->data; flag=1; } p=p->pNext; } if(flag= = 0) cout<<”n khong co so chan nao trong danh sach “; } 141. Xây dựng giải thuật và viết hàm tìm các số lẽ trong danh sách int kt_le(int k) { int flag=0; if(k%2!=0) flag=1; return flag; } 142. Xây dựng giải thuật và viết hàm in ra các số lẽ void xuatle(List l) { int flag=0;
  • 55. Node *p; p=l.pHead; while(p) { if(kt_le(p->data)= = 1) { cout<<” “<<p->data; flag=1; } p=p->pNext; } if(flag= =0) cout<<”n khong co so le nao trong danh sach “; } 143. Xây dựng giải thuật và viết hàm tìm các số nguyên tố trong danh sách: int KT_NgTo(int k) { int dem=0; for(int i=2;i<=k;i++) if(k%i==0) dem++; return dem; } 144. Xây dựng giải thuật và viết hàm in ra các số nguyên tố void XuatNgTo(List l) { int flag=0; Node *p; p=l.pHead; while(p) { if(KT_NgTo(p->data)==1) { cout<<" "<<p->data; flag=1; } p=p->pNext; } if(flag==0) cout<<"n Khong co so nguyen to nao trong danh sach"; } 145. Xây dựng giải thuật và viết hàm tìm các số chia hết cho 2: int KT_ChiaHet2(int k) { int flag=0; if(k%2==0)
  • 56. flag=1; return flag; } 146. Xây dựng giải thuật và viết hàm in ra các số chẵn void XuatChiaHet2(List l) { int flag=0; Node *p; p=l.pHead; while(p) { if(KT_ChiaHet2(p->data)==1) { cout<<" "<<p->data; flag=1; } p=p->pNext; } if(flag==0) cout<<"n Khong co so nao chia het cho 2 trong danh sach"; } 147. Xây dựng giải thuật và viết hàm đổi chổ trực tiếp –Interchange Sort: void inter_sort(List l) { for(Node *p=l.pHead,p!=l.pTail,p=p->pNext) { for(Node *k=p->pNext,k,k=k->pNext) { if(p->data,k->data); } } } 148. Xây dựng giải thuật và viết hàm sắp xếp “chọn trực tiếp –SelectionSort” void selection_sort(List l) { for(Node*p=l.pHead;p!=l.pTail;p=p->pNext) { Node*k=p; for(Node *q=p->pNext;q;q=q->pNext) { if (k->data>q->data) k=q; }
  • 57. hoanvi(k->data,p->data); } } 149. Xây dựng giải thuật và viết hàm sắp xếp “chèn trực tiêp –InsertionSort” void insertion_sort(List l) { for(Node *p=l.pHead->pNext;p;p=pNext) { Node *pos=l.pHead; while(pos!=p) { if(pos->data>p->data) hoanvi(pos->data,p->data); pos=pos->pNext; } } } } 150. Xây dựng giải thuật và viết hàm sắp xếp “dựa trên phân hoạch- Quick Sort” void quick_sort(List &l) { List l1;List l2; if (l.pHead==NULL) return ; else khoitao(l1); khoitao(l2); Node *x=l.pHead; l.pHead=p->pNext; while(l.pHead!=NULL) { Node *p=l.pHead; l.pHead=p->pNext; p->pNext=NULL; if(p->data<=x->data) themdau2(l1,p); else themdau2(l2,p); } quick_sort(l1); quick_sort(l2); if(l1.pHead==NULL) l.pHead=x; else
  • 58. { l.pHead=l1.pHead; l1.pTail->pNext=x; } x->pNext=l2.pHead; if(l2.pHead==NULL) l.pTail=x; else { l.pTail=l2.pTail; } } 151. Xây dựng giải thuật và viết hàm sắp xếp “nổi bọt –Buble” void bubble(List l) { Node *cuoi=l.pTail,*tcuoi; for(Node *dau=l.pHead;dau; dau=dau->pNext; { while(cuoi!=l.pHead) { tcuoi=dau->pNext; if(cuoi->data<tcuoi->data) hoanvi(cuoi->data,tcuoi->data); cuoi=tcuoi; } } } 152. Xây dựng giải thuật và viết hàm thêm vào đầu danh sách void themdau(List &l); {//khoitao(l); int x; cout<<"n nhap x="; cin>>x; Node *p=tao_nut(*); if(l.pHead==NULL) l.pHead=l.pTail=p; else { p->pNext=pHead; l.pHead=p; } } 153. Xây dựng giải thuật và viết hàm thêm vào cuối danh sách void themcuoi(List &l);
  • 59. {//khoitao(l); int x; cout<<"n nhap x"; cin>>x; Node *p=tao_nut(x); if (l.pHead=l.pTail=p; l.pHead=l.pTail=p; else { l.pTail->pNext=p; l.pTail=p; } } 154. Xây dựng giải thuật và viết hàm thêm vào danh sách sau một phần tử x int them_sau_y_ptx(List &l,int x,int y) { Node *p=tao_nut(y); Node *q=tim x(l,x); if (l.pHead==NULL) return 0; if (q==NULL) return 1; if(q==k.pTail) themcuoi(l); else { p->pNext=q->pNext; q->pNext=p; return 3; } 155. Xây dựng giải thuật và viết hàm thêm vào danh sách trước một phần tử x int them_truoc_y_ptx(List &l,int x,int y) { Node *p=tao_nut(y); Node *q=timx(l,x); if(l.pHead==NULL) return 0; else { if(q==NULL) return 1; if(q==l.pHead) themdau(l); else { Node*k=l.pHead; while(k->pNext!=q)
  • 60. k=k->pNext; p->pNext=q; k->pNext=p; return 3; } } } 156. Xây dựng giải thuật và viết hàm thêm phần tử x trước chẵn đầu void themx_truoc_chan_dau(List &l) { Node *p;int y; if(tim_chan_dau(l)==NULL) themdau(l); else { cout<<" nhap ptu y can them truoc chan dau"<<tim_chan_dau(l)->data<<" "; cin>> y; them_truoc_y_ptx(l,tim_chan_dau(l)->data,y); } } 157. Xây dựng giải thuật và viết hàm thêm phần tử x sau lẽ cuối void themx_sau_le_cuoi(List &l) { Node *p;int y; if(tim_le_cuoi(l)==NULL) themcuoi(l); else { cout<<" nhap ptu y can them sau le cuoi"<<tim_le_cuoi(l)->data<<" "; cin>> y; them_sau_y_ptx(l,tim_le_cuoi(l)->data,y); } } 158. Xây dựng giải thuật và viết hàm tạo một danh sách liênkết: void tao_ds(List &l) { int x,Node *p; do{ cout<<"n nhap x="; cin>> x; if(x==-1) break; p=tao_nut(x); if (l.pHead==NULL);
  • 61. l.pHead=l.pTail=p; else { l.pTail->pNext=p; l.pTail=p; } }while(1); } 159. Xây dựng giải thuật và viết hàm in số nguyên tố trong danh sách void in_so_nto(List l) { Node *k=l.pHead; for(k;k!=NULL;k=k->pNext) { if(ktsnt(k->data)==1) cout<<k->data<<" "; } } 160. Xây dựng giải thuật và viết hàm xuất các số nguyên trong danh sách Void xuat_songuyen(List l) { For(Node *p=l.pHead;p!=NULL;p=p->pNext) { Cout<< pi->data<<” “; } } 161. Xây dựng giải thuật và viết hàm xuất phần tử âm đầu tiên trong danh sách Void xuat_pt_am_dau tien(List l, int n) { Node *p=l.pHead;int dem=0; { Cout<<”n nhap pt n=:”; Cin>> n; } While(p!=NULL) { If(p->data<0) { Cout<<”n phan tu am dau tien=”; Dem++; } } If(dem= =0) Cout<<” khong tim thay”; }
  • 62. 162. Xây dựng giải thuật và viết hàm tạo danh sách random có sắp xếp Void tao_ds_random_sort(List l) { Node *p; int x; int n; { For(int i=1;i<=n;i++) { X=random()%100; P=tao_random(x); If(l.pHead= =NULL) l.pHead=l.pTail=p; else { p->pPrew=l.pTail; l.pTail->pNext=p; l.pTail=p; } } } 163. Xây dựng giải thuật và viết hàm tạo một node mới: Node *tao_node_moi(List l) { Node *p; p=new_Node; If(p= =NULL) Return NULL; p->data=l; p->pNext=NULL; retutn p; } 164. Xây dựng giải thuật và viết hàm nhập một số nguyên vào danh sách: Void nhap_songuyen(List &l) { Int n; Cout<<”n nhap so luong node:”; Cin>> n; Init(l); For(int i=1;i<=n;i++) { Int x; Cout<<”n nhap mot so nguyen:”; Cin>> x; Node*p=getnode(x); Themdau(l,p);
  • 63. } } 165. Xây dựng giải thuật và viết hàm duyệt qua các nút trong một danh sách: Void duyet_ds(List l) { Node *p; p=l.pHead; while (p!=NULL) { Duyet_Node(p); p=p->pNext; } } 166. Xây dựng giải thuật và viết hàm tìm kiếm một phần tử X trong danh sách: Node *search(List l,int x) { Node *p; P=l.pHead; While((p!=NULL)&&(p->data!=x)) p=p->link; return p; } 167. Xây dựng giải thuật và viết hàm sao chép danh sách thành môt danh sách và sắp sếp: Void sao_chep_va_sap_xep(List &l) 168. Xây dựng giải thuật và viết hàm đảo ngược danh sách: Void dao_ds(List &l) 169. Xây dựng giải thuật và viết hàm cộng liêntiếphai phần tử trong danh sách: Void cong_lien_tiep_2pt(List &l) 170. Xây dựng giải thuật và viết hàm tách danh sách: Void tach_List(List &l, List &l1,List &l2) { Khoitao(l1); Khoitao(l2); Do { P=l.pHead; l.pHead=p->pNext; p->pHead=NULL; if(p->data%2==0) themdau2(l1,p); else
  • 64. themdau2(l2,p); } While(l.pHead!=NULL) l.pTail=NULL; } 171. Xây dựng giải thuật và viết hàm nối hai danh sách: Void noi_ds(List &l,List &l1,List &l2) { Khoitao(l1); Khoitao(l2); Cout<<”n nhap danh sach l1.ketthuc-1”; Tao_ds(l1); Cout <<”n nhap danh sachl2.ketthuc-1”; Tao_ds(l2); If(l1.pHead==NULL) l=l2; if(l2.pHead==NULL) l=l1; else { l1.pTail->pNext=l2.pHead; l.pHead=l1.pHead; l.pTail=l2.pTail; } }
  • 65. III: DANH SÁCH LIÊN KẾT KÉP 172. Khai báo cấu trúc dữ liệucủa một danh sách liênkết đơn tổng quát typedef struct tagNode { int data; struct tagNode *pnext; }Node; 173. Xây dựng giải thuật và viết hàm khởi tạo danh sách liênkết đơn void khoi_tao(List &l) { l.phead=l.ptail=NULL; } 174. Xây dựng giải thuật và viết hàm định nghĩa danh sách liênkết Typedef struct tag_List { Node *phead; Node *ptail; }List; 175. Xây dựng giải thuật và viết hàm tạo nút danh sách liênkết đơn Node* getNode(int x) {Node *p=new Node; if(p==NULL) {cout<<"nKhong du bo nho"; exit(0); } p->pprev=NULL; p->data=x; p->pnext=NULL; return p; } 176. Xây dựng giải thuật và viết hàm tạo danh sách ngẫu nhiên void tao_dsng(List &l) {int n,x; Node *p; cout<<"Nhap so pt n:t"; cin>>n; for(int i=1;i<=n;i++) { x=rand()%500-rand()%500; //nh?p ng?u nhiên p=getNode(x); if(l.phead==NULL) l.phead=l.ptail=p; else {p->pnext=l.phead;
  • 66. l.phead->pprev=p; l.phead=p; } } } 177. Nhập bằng tay void tao_ds(List &l) {int n,x; Node *p; cout<<"Nhap so pt n:t"; cin>>n; for(int i=1;i<=n;i++) {cout<<"Nhap x:"; cin>>x; p=getNode(x); if(l.phead==NULL) l.phead=l.ptail=p; else {p->pnext=l.phead; l.phead->pprev=p; l.phead=p; } } } 178. Xây dựng giải thuật và viết hàm duyệt danh sách liênkết void xuat_ds(List l) {Node *p=l.phead; while(p) {cout<<p->data<<" -> "; p=p->pnext; } cout<<"Null"<<endl; } 179. Xây dựng giải thuật và viết hàm đếm số lượng node trong danh sách liênkết đơn 180. Xây dựng giải thuật và viết hàm đếm số lượng node có giá trị âm 181. Xây dựng giải thuật và viết hàm kiểm tra danh sách liênkết tồn tại node có giá trị dương hay không? 182. Chèn 1 pt vào đầu ds void them_dau(List &l,int x) { cout<<"nNhap pt muon them:"; cin>>x; Node *p=getNode(x);
  • 67. if(l.phead==NULL) l.phead=l.ptail=p; else { p->pnext=l.phead; l.phead->pprev=p; l.phead=p; } } 183. Xây dựng giải thuật và viết hàm chèn phần tử vào cuối danh sách void them_cuoi(List &l,int x) { cout<<"Nhap pt muon them:"; cin>>x; Node *p=getNode(x); if(l.ptail==NULL) l.phead=l.ptail=p; else {p->pprev=l.ptail; l.ptail->pnext=p; l.ptail=p; } } 184. Xây dựng giải thuật và viết hàm thêm 1 nút vào sau pt có giá trị là y void themsau_q(List &l,int x,int y) { if(l.phead==NULL) cout<<"danh sach rong"; else { Node *q; q=timpt_y(l,y); if(q==NULL) cout<<"khong tim thay pt thoa yeu cau"; else{ if(q==l.ptail) them_cuoi(l,x); else { Node *k; cout<<"nhap pt can them: "; cin>>x; cout<<endl; k=getNode(x); k->pnext=q->pnext; q->pnext=k; k->pprev=q;
  • 68. } } } } 185. Xây dựng giải thuật và viết hàm thêm 1 nút vào trước phần tử có giá trị y void themtruoc_q(List &l,int x,int y) { if(l.phead==NULL) cout<<"danh sach rong"; else { Node *q; q=timpt_y(l,y); if(q==NULL) cout<<"khong tim thay pt thoa y/cau"; else { if(q==l.phead) them_dau(l,x); else { cout<<"nhap pt can them: "; cin>>x; Node *p=getNode(x); (q->pprev)->pnext=p; p->pprev=q->pprev; q->pprev=p; p->pnext=q; } } } } 186. Xây dựng giải thuật và viết hàm thêm 1 nút vào trước chẳn đầu void ThemX_truoc_chan_dau(LIST &l) { NODE *p;int y; if(chan_dau(l) = = NULL) // khong tim thay chan dau, them x vao dau dsach themdau(l); else // tim thay, thuc hien them truoc chan dau { cout<<"Nhap phan tu Y can them truoc chan dau "<<tim_chan_dau(l)- >data<<" ";cin>>y; themtruoc_q( l , chan_dau(l)->data,y); } }
  • 69. 187. Xây dựng giải thuật và viết hàm xóa đầu void xoa_dau(List &l) {Node *p; if(l.phead==NULL) cout<<"DANH SACH RONG~"; else { if(l.phead==l.ptail) l.phead=l.ptail=NULL; else {p=l.phead; l.phead=p->pnext; l.phead->pprev=NULL; delete(p); } } } 188. Xây dựng giải thuật và viết hàm xóa cuối void xoa_cuoi(List &l) { Node *p; if(l.phead==NULL) cout<<"DANH SACH RONG~"; else { if(l.phead==l.ptail) l.phead=l.ptail=NULL; else {p=l.ptail; l.ptail=p->pprev; l.ptail->pnext=NULL; delete(p); } } } 189. Xây dựng giải thuật và viết hàm xóa 1 nút trước pt có giá trị y void xoatruoc_q(List &l,int y) { Node *q,*p; if(l.phead==NULL) cout<<"Danh sach rong~"; else { p=timpt_y(l,y); if(p!=NULL)
  • 70. { q=p->pprev; if(q!=NULL) { p->pprev=q->pprev; if(q==l.phead) l.phead=p; else q->pprev->pnext=p; delete(q); } else cout<<"nkhong co pt xoat"; } else xoa_cuoi(l); } } 190. Xây dựng giải thuật và viết hàm xóa 1 nút sau pt có giá trị y void xoasau_q(List &l,int y) { Node *p; Node *q; if(l.phead==NULL) cout<<"Danh sach rong~"; else { cout<<"Nhap pt y can tim:t"; cin>>y; q=timpt_y(l,y); if(q!=NULL) { p=q->pprev; if(p!=NULL) { q->pnext=p->pnext; p->pnext->pprev=q; delete(p); { cout<<"lol~...Null"; } else xoa_dau(l); } } 191. Xây dựng giải thuật và viết hàm xóa phần tử x void xoapt_y(List l,int y) { Node *q; if(l.phead->data==y) xoa_dau(l); else
  • 71. {if(l.ptail->data==y) xoa_cuoi(l); else { Node *p=l.phead->pnext; while(p) { if(p->data==y) q=p->pnext; q=p->pnext; q->pprev=p->pprev; p->pprev->pnext=q; delete(p); p=q; continue; } p=p->pnext; } } } 192. Xây dựng giải thuật và viết hàm xóa phần tử lớn nhất void xoa_max(List &l,int max) {if(l.phead==NULL) cout<<"ds rong"; else {if(l.phead==l.ptail) l.phead=l.ptail=NULL; else {if(l.phead->data==max) xoa_dau(l); if(l.ptail->data==max) xoa_cuoi(l); else { Node *p=l.phead->pnext; while(p) { if(p->data==max) Node *q=p->pnext; q->pprev=p->pprev; p->pprev->pnext=q; delete(p); p=q;continue; } p=p->pnext; } } }
  • 72. } 193. Xây dựng giải thuật và viết hàm xóa List void xoa_LIST(List &l) { Node *k = l.phead; while(k!=NULL) { l.phead=k->pnext; k=l.phead; } } 194. Xây dựng giải thuật và viết hàm đổi chỗ trực tiếp(interchange sort) void inter_sort(List l) { for(Node *p=l.phead;p!=l.ptail;p=p->pnext) {for(Node *k=p->pnext;k;k=k->pnext) { if(p->data>k->data) hoanvi(p->data,k->data); } } } 195. Xây dựng giải thuật và viết hàm sắp xếp chọn trực tiếp(selectionsort) void selection_sort(List l) { for(Node *p=l.phead;p!=l.ptail;p=p->pnext) { Node *k=p; for(Node *q=p->pnext;q;q=q->pnext) { if(k->data>q->data) k=q; } hoanvi(k->data,p->data);} } 196. Xây dựng giải thuật và viết hàm sắp xếp nổi bọt(Bubble sort) void bubble(List l) { Node *dau, *cuoi; for(dau=l.phead;dau!=l.ptail;dau=dau->pnext) { for(cuoi=l.ptail;cuoi!=dau;cuoi=cuoi->pprev) { if(cuoi->data < (cuoi->pprev)->data) hoanvi(cuoi->data,(cuoi->pprev)->data);
  • 73. } } } 197. Xây dựng giải thuật và viết hàm sắp xếp chèn trực tiếp(insertionsort)_ void insertion_sort(List l) { Node *pos;int x; for(Node *p=l.phead->pnext;p;p=p->pnext) { x = p->data; pos=p->pprev; while( (pos!= NULL) && (pos->data > x ) ) { x = pos->data; pos=pos->pprev; } pos->data = x; } 198. Xây dựng giải thuật và viết hàm sắp xếp phân hoạch nhanh (Quick sort) void quick_sort(List &l) { List l1;List l2; if(l.phead= =NULL) // rong return; else khoi_tao(l1); khoi_tao(l2); Node *x=l.phead; l.phead=x->pnext; while(l.phead!=NULL){ Node *p=l.phead; l.phead=p->pnext; p->pnext=NULL; if(p->data <= x->data) them_dau2(l1,p); else them_dau2(l2,p); } quick_sort(l1); quick_sort(l2); if(l1.phead==NULL) l.phead=x; else { l.phead = l1.phead; l1.ptail->pnext = x;
  • 74. } x->pnext = l2.phead; if(l2.phead==NULL) l.ptail = x; else { l.ptail = l2.ptail; } } 199. Xây dựng giải thuật và viết hàm tổng danh sách long tong_list(List l) { Node*k=l.phead; int tong = 0; for(k;k!=NULL;k=k->pnext) { tong+=k->data; } return tong; } 200. Xây dựng giải thuật và viết hàm tổng các phần tử dương long tong_duong(List l) { Node *pi=l.phead; int s = 0; for(pi;pi!=NULL;pi=pi->pnext) {if(pi->data>0) s+=pi->data; }return s; } 201. Xây dựng giải thuật và viết hàm tổng các phần tử âm long tong_am(List l) { Node *pi=l.phead; int s = 0; for(pi;pi!=NULL;pi=pi->pnext) {if(pi->data<0) s+=pi->data; }return s; } 202. Xây dựng giải thuật và viết hàm tổng các phần tử lớn hơn pt liềntrước nó long tonglonlientruoc(List l) { int s=0;
  • 75. for(Node *pi=l.phead->pnext;pi;pi=pi->pnext) {if(pi->data > pi->pprev) s+=pi->data }return s; } 203. Xây dựng giải thuật và viết hàm tổng các phần tử lớn hơn trị tuyệt đối đứng liềnsau nó long ttd_liensau(List l) { int s=0; for(Node *p=l.phead;p;p=p->pnext) { if(p->data > abs(p->pnext) ) { s+=p->data; } }return s; } 204. Xây dựng giải thuật và viết hàm trung bình cộng các số dương long tbc_duong(List l) {int s=0;int dem=0; for(Node *p=l.phead;p;p=p->pnext) {if(p->data>0) s+=p->data; dem++; }if(dem= =0) {cout<<”nKo co pt thoa y/c”; return 0; } return s/dem; } 205. Xây dựng giải thuật và viết hàm trung bình cộng các số lớn hơn x long tbc_lon_x(List l,int x) {int s=0;int dem=0; for(Node *p=l.phead;p;p=p->pnext) {if(p->data>x) s+=p->data; dem++; }if(dem= =0) {cout<<”nKo co pt thoa y/c”; return 0; } return s/dem; } 206. Xây dựng giải thuật và viết hàm tổng các pt lớn hơn pt xung quanh long lonhonptxungquanh(List l,) {int s=0; for(Node *p=l.phead;p;p=p->pnext) {if(p= =l.phead && p->data > p->pnext)
  • 76. s+ =p->data; if(p!=l.phead && p->data > p->pnext && p->data > p->pprev) s+ =p->data; if(p=l.ptail && p->data>p->pprev) s+ =p->data; }return s; } 207. Xây dựng giải thuật và viết hàm đếm số chẳn long dem_chan(List l) { int dem=0; for(Node *p=l.phead;p;p=p->pnext) { if(p->data%2==0) dem++; }return dem; } 208. Xây dựng giải thuật và viết hàm đếm số lẻ long dem_le(List l) { int dem=0; for(Node *p=l.phead;p;p=p->pnext) { if(p->data%2!=0) dem++; }return dem; } 209. Xây dựng giải thuật và viết hàm đếm dương chia hết cho 7 long duongchia7(List l) { int dem=0; for(Node *p=l.phead;p;p=p->pnext) { if(p->data>0 && p->data%7==0) { dem++; } }return dem; } 210. Xây dựng giải thuật và viết hàm đếm số lần xuất hiện của x long demlanxuathien(List l,int x) { int dem=0; for(Node *p=l.phead;p;p=p->pnext) {
  • 77. if(p->data==x) dem++; } return dem; } 211. Xây dựng giải thuật và viết hàm đếm 2 pt kề nhau mà cả 2 trái dấu long demketraidau(List l) { int dem=0; for(Node *p=l.phead;p;p=p->pnext) { if( (p->data) * (p->pnext) <0 ) dem++; } return dem; } 212. Xây dựng giải thuật và viết hàm đếm pt lớn hơn hay nhỏ hơn pt xung quanh long demlonnho(List l) {int dem=0; for(Node *p=l.phead;p;p=p->pnext) {if(p= =l.phead && p->data!=p->pnext) dem++; if(p= =l.ptail && p->data!=p->pprev) dem++; if((p->data>p->pnext && p->data>p->pprev) | | (p->data<p->pnext && p->data<p- >pprev)) dem++; }return dem; } 213. Xây dựng giải thuật và viết hàm đếm pt max long dem_max(List l) {int dem=0; Node *pmax=l.phead; for(pmax;pmax;pmax=pmax->pnext) {for(p=pmax->pnext;p;p=p->pnext) {if(pmax->data < p->data) {pmax=p;dem++;} } }return dem; } 214. Xây dựng giải thuật và viết hàm đếm pt kề nhau mà cà đều chẳn long ke_chan(List l) {int dem=0; for(Node *p=l.phead;p;p=p->pnext) {if(p->data%2= =0 && p->pnext%2= =0)
  • 78. dem++; } return dem; } 215. Xây dựng giải thuật và viết hàm đếm số nguyên tố int KTSNT(int n) { if(n<2) return 0; for(int i=2;i<=n/2;i++) if(n%i= =0) return 0; return 1; } int dem_so_ngto(List l) { Node *k=l.phead; int dem=0; for(k;k!=NULL;k=k->pnext) { if(KTSNT(k->data) = = 1) dem++; } return dem; } 216. Xây dựng giải thuật và viết hàm đếm số nút trong danh sách int count_node(List l) { Node *k=l.phead; int count = 0; for(k;k!=NULL;k=k->pnext) { count++; } return count; } 217. Kiểm tra danh sách có giá trị 0? int kt0(List l) { int flag=0; for(Node *p=l.phead;p;p=p->pnext) { if(p->data= =0) {flag=1; break;} } return flag; }
  • 79. 218. Kiểm tra danh sách có số chẳn hay ko? int kt_chan(List l) { int flag=0; for(Node *p=l.phead;p;p=p->pnext) { if(p->data%2= =0) { flag=1; cout<<"nDS CO GIA TRI CHAN";break; } }if(flag= =0){cout<<"nKO TIM THAY GTRI CHAN";} return flag; } 219. Xây dựng giải thuật và viết hàm kiểm tra danh sách có tính chất lẻ(lẻ khi tổng 2 pt liêntiếpluônlẻ) int kt_chanle(List l) { int flag=1; for(Node *p=l.phead;p!=l.ptail;p=p->pnext) { if( (p->data+p->pnext->data)%2==0) { flag=0; cout<<"nDS KO CO TINH CHAT LE"; break; } }if(flag= =1){cout<<"DS CO TC LE";} return flag; } 220. Xây dựng giải thuật và viết hàm kiểm tra danh sách co tăng dần int kt_tang(List l) { int flag=1; for(Node *p=l.phead;p!=l.ptail;p=p->pnext) { if(p->data>p->pnext->data) { flag=0; cout<<"n DS CHUA TANG"; break; } }if(flag= =1){cout<<"nDS DA DUOC SX TANG DAN";} return flag; }
  • 80. 221. Xây dựng giải thuật và viết hàm kiểm tra phần tử trong danh sách có bằng nhau int kt_bang(List l) { int flag=0; for(Node *p=l.phead;p;p=p->pnext) { for(Node *k=p->pnext;k;k=k->pnext) { if(p->data==k->data) { flag=1;cout<<"nDS CO PT BANG NHAU"; break; } } }if(flag= =0){cout<<"nDS KO CO PT NAO BANG NHAU";} return flag; } 222. Xây dựng giải thuật và viết hàm kiểm tra danh sách có giảm dần int kt_giam(List l) { int flag=1; for(Node *p=l.phead;p!=l.ptail;p=p->pnext) { if(p->data<p->pnext->data) { flag=0; cout<<"n DS CHUA TANG"; break; } }if(flag= =1){cout<<"nDS DA DUOC SX TANG DAN";} return flag; } 223. Xây dựng giải thuật và viết hàm đếm thỏa: lớn hơn các pt trước nó int dem_kt(List l) {int flag=1; for(Node *p=l.ptail;p!=l.phead;p=p->pprev) {for(Node *k=p->pprev;k;k=k->pprev) {if(p->data<k->data | | p->data = = k->data) flag=0;break; } } if(flag= =1){cout<<”n Co pt thoa y/c”; else cout<<”nKhong thoa”;
  • 81. return flag; } 224. Xây dựng giải thuật và viết hàm kiểm tra danh sách có 2 giá trị 0 liêntiếp? int kt0_lientiep(List l) { int flag=0; for(Node *p=l.phead;p!=l.ptail;p=p->pnext) { if(p->data= =0 && p->pnext->data = = 0) {flag=1; break;} }return flag; } 225. Xây dựng giải thuật và viết hàm kiểm tra danh sách có toàn sồ chẳn ? int kt_toan_chan(List l) { int flag=1; for(Node *p=l.phead;p;p=p->pnext) { if(p->data%2 ! =0) { flag=0; break; } } return flag; } 226. Xây dựng giải thuật và viết hàm tìm pt chẳn max và lớn hơn pt lẻ max int kiem_tra_chan(List l) { Node *p =l.phead; int dem=0; while(p) { if(p->data % 2==0) dem++; p=p->pnext; } if( dem == 0) return 0; return 1; } int kiem_tra_le(List l) { Node *p =l.phead; int dem=0; while(p)
  • 82. { if(p->data % 2!=0) dem++; p=p->pnext; } if( dem == 0) return 0; return 1; } Node* chanmax(List l) { int x; Node *p=l.phead;Node *maxx = getNode(x); if(kiem_tra_chan(l) == 0) return NULL; else{ while(p) { if((p->data % 2 == 0) && (p->data > maxx->data)) maxx=p; p=p->pnext; } return maxx; } } Node* lemax(List l) { int x; Node *p=l.phead; Node *maxx = getNode(x); if(kiem_tra_le(l) == 0) return NULL; else{ while(p) { if((p->data % 2 != 0) && (p->data > maxx->data)) maxx=p; p=p->pnext; } return maxx; } } void chanmax_max_minmax(List &l) { Node *chanm = chanmax(l); Node *lem = lemax(l); if(chanm->data < lem->data) cout<<"Khong thoa y/c! So chan lon nhat la: "<<chanm->data<<" nho hon so le lon nhat la: "<<lem->data;
  • 83. if(chanm->data > lem->data) cout<<"Thoa y/c! So chan lon nhat la: "<<chanm->data<<" va so le lon nhat la: "<<lem->data; } 227. Xây dựng giải thuật và viết hàm tìm max Node *tim_max(List l) { Node *pmax=l.phead; for(Node *pi=l.phead->pnext;pi!=NULL;pi=pi->pnext) { if(pi->data>pmax->data) pmax=pi; } cout<<"Pt max la: "<<pmax->data; return pmax; } 228. Xây dựng giải thuật và viết hàm tìm dương đầu tiên Node *duong_dau(List l) { Node *pi=l.phead; for(pi;pi;pi=pi->pnext) { if(pi->data>0) { cout<<"n Pt duong dau tien la: "<<pi->data; return pi; } }cout<<"nKO TIM THAY PT DUONG"; } 229. Xây dựng giải thuật và viết hàm tìm chẳn cuối cùng Node *chan_cuoi(List l) { for(Node *pi=l.ptail;pi;pi=pi->pprev) { if(pi->data%2==0) { cout<<"n Chan cuoi la: "<<pi->data; return pi;} }cout<<"n KO TIM THAY SO CHAN CUOI"; } 230. Xây dựng giải thuật và viết hàm tìm chẳn đầu Node *chan_dau(List l) { for(Node *pi=l.phead;pi;pi=pi->pnext) {
  • 84. if(pi->data%2==0) { cout<<"n Chan dau la: "<<pi->data; return pi;} }cout<<"n KO TIM THAY SO CHAN DAU"; } 231. Xây dựng giải thuật và viết hàm tìm dương min Node *duong_min(List l) { Node *duongmin; for(duongmin=l.phead;duongmin;duongmin=duongmin->pnext) { if(duongmin->data>0) { break; } } if(duongmin!=NULL) { for(Node *k=duongmin->pnext;k;k=k->pnext) { if( (k->data>0) && (duongmin->data>k->data) ) { duongmin=k; cout<<"nDuong min:"<<duongmin->data;break; } }return k; }else cout<<"n KO THAY PT DUONG MIN"; } 232. Xây dựng giải thuật và viết hàm tìm min Node *tim_min(List l) { Node *pmin=l.phead; for(Node *pi=l.phead->pnext;pi!=NULL;pi=pi->pnext) { if(pi->data<pmin->data) pmin=pi; } cout<<"Pt min la: "<<pmin->data; return pmin; } 233. Xây dựng giải thuật và viết hàm tìm âm đầu Node *am_dau(List l) { Node *pi=l.phead; for(pi;pi;pi=pi->pnext)
  • 85. { if(pi->data<0) { cout<<"n Am dau la: "<<pi->data; return pi;} }cout<<"n KO TIM THAY PT AM DAU"; }
  • 86. IV: CÂY NHỊ PHÂN 234. Khai báo cây nhị phân struct Tree { int Data; Tree *Left; Tree *Right; }; 235. Xây dựng giải thuật và viết hàm tạo cây nhị phân tìm kiếm void InsertNode(Tree* &T,int d)//Tao Cay Nhi Phan Tim Kiem { if(T!=NULL) { if(T->Data==d) return; if(T->Data>d) InsertNode(T->Left,d); if(T->Data<d) InsertNode(T->Right,d); } else { T=new Tree; T->Data=d; T->Left=NULL; T->Right=NULL; return; } } 236. Xây dựng giải thuật và viết hàm duyệt cây nhị phân void Left_Node_Right(Tree* T)//In Kieu LNR; { if(T!=NULL) { Left_Node_Right(T->Left); printf("%5d",T->Data); Left_Node_Right(T->Right); } } 237. Xây dựng giải thuật và viết hàm duyệt cây nhị phân void Get_Tree(Tree* &T)//Nhap Cay Nhi phan Tim Kiem { int i,d=10,x; printf("nNhap so phan tu cua mot cay : ");
  • 87. scanf("%d",&d); for(i=0;i<d;i++) { printf("Nhap phan tu thu %d = ",i+1); scanf("%d",&x); InsertNode(T,x); } } 238. Xây dựng giải thuật và viết hàm đếm số nút của cây int Count_Node(Tree* T)//dem so nut { static int dem=0; if(T!=NULL) { Count_Node(T->Left); dem++; Count_Node(T->Right); } return dem; } 239. Xây dựng giải thuật và viết hàm đếm số nút có giá trị dương có trong cây 240. Xây dựng giải thuật và viết hàm tìm phần tử có giá trị lớnnhất trong cây 241. Xây dựng giải thuật và viết hàm đếm số nút lá int Count_Leaf_Node(Tree* T)//Dem so nut la { static int dem=0; if(T!=NULL) { Count_Leaf_Node(T->Left); if(T->Left==NULL&&T->Right==NULL) dem++; Count_Leaf_Node(T->Right); } return dem; } 242. Xây dựng giải thuật và viết hàm đếm số nút có một cây con trái int Count_Left_Node(Tree* T)//Dem so nut co mot cay con trai { static int dem=0; if(T!=NULL) { Count_Left_Node(T->Left); if(T->Left!=NULL)
  • 88. dem++; Count_Left_Node(T->Right); } return dem; } 243. Xây dựng giải thuật và viết hàm đếm số nút có một cây con int Count_One_Node(Tree* T)//Dem so nut co mot cay con { static int dem=0; if(T!=NULL) { Count_One_Node(T->Left); if(T->Left!=NULL&&T->Right==NULL||T->Left==NULL&&T->Right!=NULL) dem++; Count_One_Node(T->Right); } return dem; } 244. Xây dựng giải thuật và viết hàm đếm độ sâu int Count_Depth(Tree *T,int dem=0)//Dem do sau { static int max=0; if(T!=NULL) { Count_Depth(T->Left,++dem); dem--; Count_Depth(T->Right,++dem); dem--; } else { if(dem>max) max=dem; } return max; }
  • 89. 245. Xây dựng giải thuật và viết hàm hủy một nút có khóa là X trong cây nhị phân 246. Xây dựng giải thuật và viết hàm tính tổng các nút trong cây 247. Xây dựng giải thuật và viết hàm tính tổng các nút là trong cây 248. Xây dựng giải thuật và viết hàm tính tổng các nút có một nút con 249. Xây dựng giải thuật và viết hàm tính tổng các nút có đúng hai nút con 250. Xây dựng giải thuật và viết hàm tính tổng các nút có giá trị lẽ 251. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong cây 252. Xây dựng giải thuật và viết hàm tìm giá trị âm lớn nhất trong cây
  • 90. 1. Xây dựng giải thuật và viết hàm nhập mảng bằng tay............................................ 1 2. Xây dựng giải thuật và viết hàm nhập mảng ngẫu nhiên....................................... 1 3. Xây dựng giải thuật và viết hàm nhập mảng đệ quy ............................................... 1 4. Xây dựng giải thuật và viết hàm xuất mảng .............................................................. 1 5. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong mảng một chiều n số nguyên ...................................................................................................................................... 1 6. Xây dựng giải thuật và viết hàm tìm giá trị dương đầu tiêntrong mảng, không có trả về 0 ..................................................................................................................................... 2 7. Xây dựng giải thuật và viết hàm tìm số chẵn cuối cùng trong mảng, không có thì trả về 0..................................................................................................................................... 2 8. Xây dựng giải thuật và viết hàm tìm vị trí của phần tử nhỏ nhất trong mảng.. 2 9. Xây dựng giải thuật và viết hàm tìm vị trí của giá trị chẵn đầu tiêntrong mảng, không có thì trả về 0 ...................................................................................................... 2 10. Xây dựng giải thuật và viết hàm tìm vị trí số hoàn thiện cuối cùng trong mảng, không có trả về 0 ......................................................................................................................... 3 11. Xây dựng giải thuật và viết hàm tìm vị trí dương nhỏ nhất trong mảng, không có trả về 0. .................................................................................................................................... 3 12. Xây dựng giải thuật và viết hàm tìm số nguyên tố đầu tiêntrong mảng, không có trả về 0. .................................................................................................................................... 3 13. Xây dựng giải thuật và viết hàm tìm số nguyên tố lớn nhất trong mảng, không có trả về 0. .................................................................................................................................... 4 14. Xây dựng giải thuật và viết hàm tìm số hoàn thiệncuối cùng trong mảng, không có trả về 0......................................................................................................................... 5 15. Xây dựng giải thuật và viết hàm tìm số hoàn thiện nhỏ nhất trong mảng, không có trả về 0. .................................................................................................................................... 5 16. Xây dựng giải thuật và viết hàm tìm giá trị chẵn nhỏ nhất trong mảng, không có trả về 0. .................................................................................................................................... 6 17. Xây dựng giải thuật và viết hàm tìm vị trí có giá trị âm lớn nhất trong mảng, không có thì trả về -1. ................................................................................................................ 6 18. Xây dựng giải thuật và viết hàm tìm những phần tử trong mảng xa giá trị x nhất. ............................................................................................................................................... 6 19. Xây dựng giải thuật và viết hàm tìm vị trí trong mảng mà giá trị tại đó gần x nhất. ............................................................................................................................................... 7 20. Xây dựng giải thuật và viết hàm tìm đoạn [a,b] sao cho đoạn này chứa tất cả các giá trị trong mảng................................................................................................................ 7 21. Xây dựng giải thuật và viết hàm tìm trong mảng giá trị đầu tiên lớn hơn 2010, không có trả về 0......................................................................................................................... 7 22. Xây dựng giải thuật và viết hàm tìm trong mảng giá trị đầu tiên nằm trong khoảng (X,Y) cho trước, không có thì trả về X. .................................................................. 8
  • 91. 23. Xây dựng giải thuật và viết hàm tìm số chính phương đầu tiên trong mảng, không có thì trả về 0................................................................................................................... 8 24. Xây dựng giải thuật và viết hàm tìm một vị trí của phần tử đầu tiên có giá trị bằng tích hai phần tử lân cận, nếu mảng không tồn tại phần tử thỏa điều kiện trên thì trả về 0. ................................................................................................................................... 8 25. Xây dựng giải thuật và viết hàm tìm giá trị đầu tiêntrong mảng thỏa tính chất số gánh không có thì trả về 0 ( ví dụ: 12321)........................................................................ 8 26. Xây dựng giải thuật và viết hàm tìm giá trị đầu tiêncó chữ số đầu tiênlà chữ số lẻ trong mảng, không có thì trả về 0 ( ví dụ: 110). ......................................................... 9 27. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất toàn chữ số lẻ so với những số cùng thỏa điều kiện trong mảng, không có thì trả về 0.................................... 9 28. Xây dựng giải thuật và viết hàm tìm giá trị lớnnhất trong mảng có dạng 2^k, so với những số cùng thỏa điều kiện, nếu mảng không có phần tử dạng 2^k thì trả về 0. 10 29. Xây dựng giải thuật và viết hàm tìm số chẵn lớn nhất, nhỏ hơn mọi giá trị lẻ có trong mảng một chiều n số nguyên, nếu mảng chỉ chứa các phần tử lẻ hoặc chẵn thì return 0. ......................................................................................................................................11 30. Xây dựng giải thuật và viết hàm tìm số nguyên tố nhỏ nhất, lớn hơn mọi giá trị có trong mảng............................................................................................................................11 31. Xây dựng giải thuật và viết hàm liệt kê các phần tử thuộc đoạn [x,y] cho trước trong mảng.................................................................................................................................11 32. Xây dựng giải thuật và viết hàm liệt kê các số trong mảng một chiều thỏa điều kiện: lớn hơn trị tuyệt đối của số đứng liền sau nó...........................................................12 33. Xây dựng giải thuật và viết hàm tính tổng các phần tử trong mảng một chiều n số nguyên. ...................................................................................................................................12 34. Xây dựng giải thuật và viết hàm tính tổng các phần tử dương trong mảng. ....12 35. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số đầu là lẻ trong mảng, vd: 15, 30, ......................................................................................................................13 36. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số hàng chục là 5 trong mảng.................................................................................................................................13 37. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn phần tử đứng liền trước nó trong mảng. .......................................................................................................14 38. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn giá trị tuyệt đối của phần tử đứng liền sau nó.................................................................................................14 39. Xây dựng giải thuật và viết hàm tính tổng các phần tử lớn hơn phần tử xung quanh trong mảng. ...................................................................................................................14 40. Xây dựng giải thuật và viết hàm tính tổng các phần tử cực trị trong mảng. Phần tử cực trị là phần tử lớn hơn hoặc nhỏ hơn hai phần tử xung quanh. ..............14 41. Xây dựng giải thuật và viết hàm tính tổng các phần tử là số chính phương trong mảng.................................................................................................................................15
  • 92. 42. Xây dựng giải thuật và viết hàm tính tổng các phần tử là số đối xứng trong mảng, vd:12321( số gánh )......................................................................................................15 43. Xây dựng giải thuật và viết hàm tính tổng các phần tử có chữ số đầu là chẵn trong mảng.................................................................................................................................16 44. Xây dựng giải thuật và viết hàm tính trung bình cộng các phần tử dương trong mảng. ...........................................................................................................................................16 45. Xây dựng giải thuật và viết hàm tính trung bình cộng các số nguyên tố trong mảng. ...........................................................................................................................................16 46. Xây dựng giải thuật và viết hàm tính trung bình cộng các phần tử trong mảng lớn hơn x.....................................................................................................................................17 47. Xây dựng giải thuật và viết hàm tính khoảng cách trung bình giữacác phần tử trong mảng.................................................................................................................................17 48. Xây dựng giải thuật và viết hàm đếm số lượng phần tử chẵn có trong mảng một chiều n số nguyên. ............................................................................................................17 49. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử dương chia hết cho 7 trong mảng..............................................................................................................................18 50. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử thỏa tính chất số gánh ( số đối xứng ) trong mảng. ..........................................................................................18 51. Xây dựng giải thuật và viết hàm đếm số lần xuất hiện của giá trị X trong mảng. 18 52. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử có chữ số tận cùng bằng 5 trong mảng. ..................................................................................................................19 53. Xây dựng giải thuật và viết hàm cho biết sự tương quan giữa số lượng chẵn và lẻ trong mảng, hàm trả về một trong ba giá trị: -1, 0, 1. -1 là lẻ nhiều hơn chẵn; 0 là chẵn bằng lẻ; 1 là chẵn nhiều hơn lẻ....................................................................................19 54. Xây dựng giải thuật và viết hàm đếm phần tử cùng lớn hơn hoặc nhỏ hơn các phần tử xung quanh trong mảng ( đếm phần tử cực trị ). ..............................................19 55. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử là số nguyên tố trong mảng.................................................................................................................................20 56. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử là số hoàn thiện trong mảng.................................................................................................................................20 57. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử lớn nhất trong mảng. ...........................................................................................................................................21 58. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau mà cả hai đều là chẵn (kề trước hoặc kề sau và chẵn)........................................................................21 59. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau mà cả hai trái dấu nhau ( kề trước hoặc kề sau và trái dấu).............................................................21 60. Xây dựng giải thuật và viết hàm đếm số lượng các phần tử kề nhau, mà số đứng trước cùng dấu với số đứng sau và có giá trị tuyệt đối nhỏ hơn trị tuyệt đối của số đứng sau.................................................................................................................................21