Tải bản đầy đủ (.doc) (41 trang)

mot so bai tap C ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (287.92 KB, 41 trang )

Sưu tầm bởi boy_dt3; nguồn trathai.vn

bài 1(1/500)
/* Bai tap 9_1 - Dem so lan xuat hien cac ky tu trong chuoi */
#include <stdio.h>
#include <ctype.h>
void main()
{
char chuoi[80];
int i = 0, count = 0;
printf("\nNhap vao mot chuoi bat ky : ");
gets(chuoi);
while (chuoi[i] != 0)
{
if (isalpha(chuoi[i++]))
count++;
}
printf("So ky tu trong chuoi = %d", count);
}
bài 2(2/500)các bài toán cơ bản
#include <stdio.h>
void main()
{
int num, tram, chuc, donvi, count = 0;
for (num = 100; num < 1000; num++)
{
donvi = num % 10;
chuc = (num / 10) % 10;
tram = num / 100;
if (donvi * donvi * donvi + chuc * chuc * chuc + tram * tram * tram == num)
{


printf("\nSo %d thoa man", num);
count++;
}
}
printf("\nTong cong co %d so thoa man yeu cau", count);
}
bài 3(3/500)các bài toán cơ bản
/* Bai tap - Bai toan Ancarokhi */
#include <stdio.h>
void main()
{
int dai, rong;
printf("\nBai toan Ancarokhi : Tim dien tich hinh chu nhat co chieu dai gap
hai");
printf("\nchieu rong va dien tich = chu vi");
for (dai = 1; dai < 100; dai ++)
for (rong=1; rong < 100; rong++)
if (dai == 2 * rong && (dai + rong)*2 == dai*rong)
printf("\nDai = %d; Rong = %d", dai, rong);
getch();
}
Đề bài: Viết hàm nhập n phần tử số thực từ bàn phím:
Cách 1: (kiểu kinh điển)
void NhapMang(float a[], int &n){ // n là tham chiếu
cout << "Nhap N = "; //thong bao cho nguoi dung nhap so luong
cin >> n; //nhap gia tri cho bien n tu ban phim
cout << "Nhap mang" << endl; //thong bao qua trinh nhap bat dau
for (int i = 0; i < n ; i++){ //vong lap duyet tu chi so 0 den n-1
cout << "a[" << i << "] = "; //moi lan: thong bao phan tu sap duoc
nhap

cin >> a[i]; //nhap gia tri tu ban phim cho phan tu thu
i
} //ket thuc vong lap
} //ket thuc ham NhapMang
Cách 2: Sử dụng con trỏ như là biến mảng
void NhapMang(float *a, int &n){
cout << "Nhap N = "; //thong bao cho nguoi dung nhap so luong
cin >> n; //nhap gia tri cho bien n tu ban phim
cout << "Nhap mang" << endl; //thong bao qua trinh nhap bat dau
for (int i = 0; i < n ; i++){ //vong lap duyet tu chi so 0 den n-1
cout << "a[" << i << "] = "; //moi lan: thong bao phan tu sap duoc
nhap
cin >> *(a+i); //nhap gia tri tu ban phim cho phan tu thu
i
} //ket thuc vong lap
} //ket thuc ham NhapMang
Ở đây a được hiểu là địa chỉ của đầu mảng, tương đương với a[0]
và (a+i) là địa chỉ của phần tử thứ i trong mảng
Cách 3: Kết hợp 2 kiểu trên
void NhapMang(float *a, int &n){
cout << "Nhap N = "; //thong bao cho nguoi dung nhap so luong
cin >> n; //nhap gia tri cho bien n tu ban phim
cout << "Nhap mang" << endl; //thong bao qua trinh nhap bat dau
for (int i = 0; i < n ; i++){ //vong lap duyet tu chi so 0 den n-1
cout << "a[" << i << "] = "; //moi lan: thong bao phan tu sap duoc
nhap
cin >> a[i]; //nhap gia tri tu ban phim cho phan tu thu
i
} //ket thuc vong lap
} //ket thuc ham NhapMang

Cách sử dụng: Hàm nhập mảng với 3 cách trên đều có thể được sử dụng vào bài 11 chế với bài giải lần 2
ở trên
Câu hỏi: Nếu đề bài là Nhập n phần tử số nguyên từ bàn phím thì chúng ta sẽ thay đổi chỗ nào
trong 3 hàm trên?
Đề bài: Nhập mảng n phần tử số nguyên từ bàn phím
a0) Liệt kê các số chẵn có trong mảng
b0) Đếm các số chẵn có trong mảng
c0) Tính tổng các số chẵn có trong mảng
a1) Liệt kê các số nguyên tố có trong mảng
b1) Đếm các số nguyên tố có trong mảng
c1) Tính tổng các số nguyên tố có trong mảng
Phân tích:
Ta đã có hàm nhập n phần tử số nguyên ở trên roài.
sau khi nhập xong số lượng n, và n phần tử số nguyên cho mảng
ta sẽ duyệt qua mọi phần tử của mảng:
trong mỗi lần duyệt, nếu gặp phần tử thỏa mãn điều kiện ( là số chẵn (a0), hoặc là số nguyên tố (a1) ) thì
sẽ xử lý phần tử đó theo yêu cầu (liệt kê, đếm hoặc là tính tổng )
Ta có code C++ giải các ý a1, b1, c1 như sau:
Code:
#include <iostream.h> //khai bao thu vien su dung luong nhap xuat
#include <iomanip.h> //thu vien dinh dang nhap xuat
#include <math.h> //thu vien cac ham toan hoc
#include <conio.h> //thu vien cung cap cac ham ve man hinh, ban phim
void NhapMang(int *a, int &n){
cout << "Nhap N = "; //thong bao cho nguoi dung nhap so luong
cin >> n; //nhap gia tri cho bien n tu ban phim
cout << "Nhap mang" << endl; //thong bao qua trinh nhap bat dau
for (int i = 0; i < n ; i++){ //vong lap duyet tu chi so 0 den n-1
cout << "a[" << i << "] = "; //moi lan: thong bao phan tu sap duoc
nhap

cin >> *(a+i); //nhap gia tri tu ban phim cho phan tu thu
i
} //ket thuc vong lap
} //ket thuc ham NhapMang
int kiemtra_snt(int x){ // tra ve 1 neu x la snt, nguoc lai tra ve 0
for(int i=2; i<=sqrt(x); i++)
if(x%i==0)return 0; //x chia het cho i => x khong phai la snt
return 1;
}
void lietke_snt(int a[], int n){ //ham in ra cac so nguyen to
for(int i=0; i < n; i++)
if(kiemtra_snt(a[i])) cout<<a[i]<<" ";
cout<<endl;
}
int dem_snt(int a[], int n){ //ham tra ve so luong so nguyen to
int c=0; //khai bao bien c dung de dem snt
for(int i=0; i < n; i++)
if(kiemtra_snt(a[i])) c++; //tang bien dem len 1
return c; //tra ve so luong snt dem duoc
}
int tong_snt(int a[], int n){ //ham tra ve so luong so nguyen to
int t=0; //khai bao bien t dung de tinh tong
for(int i=0; i < n; i++)
if(kiemtra_snt(a[i])) t += a[i]; //cong luy tien vao bien t
return t; //tra ve tong cac so nguyen to
}
void main(void)
{
clrscr(); //xoa man hinh
int a[100]; //khai bao bien mang a co 100 phan tu so nguyen

int n; //khai bao bien n luu so luong phan tu trong mang
NhapMang(a,n); //nhap n gia tri cho tung phan tu cua mang
cout<<"Liet ke snt: ";
lietke_snt(a,n);
cout<<"so luong snt: "<<dem_snt(a,n)<<endl;
cout<<"Tong cac so nguyen to: "<<tong_snt(a,n)<<endl;
getch(); //cho nguoi dung an phim bat ky de thoat
}
Còn các ý a0, b0, c0 quả thực rất đơn giản, ta chỉ việc thay hàm kiemtra là sẽ cho kết quả như ý muốn!
Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong mảng
Phân tích: Bài này có nhiều cách giải
Cách 1 (đơn giản nhất):
+đầu tiên yêu cầu người dùng nhập số lượng phần tử là n
+lặp n lần, mỗi lần nhập 1 giá trị, vừa nhập xong là so sánh với biến min và max, nếu giá trị vừa nhập bé
hơn min thì min sẽ bằng số vừa nhập, và nếu số đó lớn hơn biến max thì max sẽ bằng số đó
Cách 2: dùng mảng (kinh điển)
+ nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên)
+ gán tạm thời min và max bằng phần tử đầu tiên
+ duyệt qua toàn mảng: nếu giá trị đang duyệt bé hơn min hoặc lớn hơn max thì cập nhật lại min và max
Cách 3: dài dòng nhất
+ nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên)
+ sắp xếp tăng dần (hoặc giảm dần)
+ nếu sắp xếp tăng dần thì min sẽ là phần tử đâu tiên, và max sẽ là phần tử cuối cùng trong mảng đã sắp
xếp.
Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong mảng
Cách 1 (đơn giản nhất):
+đầu tiên yêu cầu người dùng nhập số lượng phần tử là n
+lặp n lần, mỗi lần nhập 1 giá trị, vừa nhập xong là so sánh với biến min và max, nếu giá trị vừa nhập bé
hơn min thì min sẽ bằng số vừa nhập, và nếu số đó lớn hơn biến max thì max sẽ bằng số đó
#include <iostream.h>

void main(){
int x, i, n, min, max;
cout << "Nhap so luong n = "; cin >> n; //nhap so luong
if ( n > 0 ) { //so luong > 0
cout<<" Gia tri phan tu thu dau tien = "; cin >> x; //nhap a[0]
min = max = x; //min=max=a[0]
for ( i = 2 ; i<=n; i++ ){ //vong lap i=2->n
cout<<" Gia tri phan tu thu "<<i<<" = "; cin >> x; //nhap a[i]
if ( x < min ) min = x; //cap nhat min
if ( x > max ) max = x; //cap nhat max
}
cout << "Gia tri lon nhat = " << max << endl; //in ket qua
cout << "Gia tri nho nhat = " << min << endl;
}
}
Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong mảng
Cách giải 2: dùng mảng (kinh điển)
+ nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên)
+ gán tạm thời min và max bằng phần tử đầu tiên
+ duyệt qua toàn mảng: nếu giá trị đang duyệt bé hơn min hoặc lớn hơn max thì cập nhật lại min và max
#include <iostream.h>
void NhapMang(int *a, int &n){
cout << "Nhap N = "; cin >> n;
cout << "Nhap mang" << endl;
for (int i = 0; i < n ; i++){
cout << "a[" << i << "] = ";
cin >> *(a+i);
}
}
void TimMinMax(int a[], int n, int &min, int &max){

min = max = a[0];
for (int i = 1; i < n ; i++){
if ( a[i] < min ) min = a[i];
if ( a[i] > max ) max = a[i];
}
}
void main(){
int a[100], n, min, max;
NhapMang (a, n);
TimMinMax (a, n, min, max);
cout << "Gia tri lon nhat = " << max << endl;
cout << "Gia tri nho nhat = " << min << endl;
}
Chú ý: biến min và max trong đối số hàm TimMminMax là tham chiếu nhé
void TimMinMax(int a[], int n, int &min, int &max)
trên hàm tìm min và max dùng cách kinh điển,
ta có thể thay đổi bằng cách dùng con trỏ như sau:
void TimMinMax(int *a, int n, int &min, int &max){
min = max = *a;
for (int i = 1, *p=++a; i < n ; i++, p++){
if ( *p < min ) min = *p;
if ( *p > max ) max = *p;
}
}
chú ý a tương đương với con trỏ trỏ vào đầu mảng nên *a tương đương với a[0]
ban đầu p trỏ vào phần tử a[1] (khối khởi tạo con trỏ *p=++a, tức là p trỏ tới a[1] )
trong mỗi vòng lặp p trỏ vào a[i], và cập nhật min và max nếu a[i] < min hoặc a[i] > max
sau đó p trỏ đến phần tử tiếp theo (lệnh p++ )
(biến i ở đây đảm bảo duyệt sẽ duyệt từ a[1] đến a[n-1] : duyệt hết)
Có ai ko hiểu cách làm việc của hàm tìm min max thứ 2 này không?

Đề bài: Nhập n phần tử số nguyên, in ra màn hình giá trị nhỏ nhất và lớn nhất trong mảng
Cách giải 3: dài dòng nhất
+ nhập mảng n phần tử số nguyên từ bàn phím (đã có thuật toán và code ở trên)
+ sắp xếp tăng dần (hoặc giảm dần)
+ nếu sắp xếp tăng dần thì min sẽ là phần tử đâu tiên, và max sẽ là phần tử cuối cùng trong mảng đã sắp
xếp.
#include <iostream.h>
void NhapMang(int *a, int &n){
cout << "Nhap N = "; cin >> n;
cout << "Nhap mang" << endl;
for (int i = 0; i < n ; i++){
cout << "a[" << i << "] = ";
cin >> *(a+i);
}
}
void SapXep(int a[], int n) { //sắp xếp tăng dần
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if ( a[i] > a[j] ){
int tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}
void main(){
int a[100], n;
NhapMang (a, n);
SapXep (a, n);
cout << "Gia tri nho nhat = " << a[0] << endl;
cout << "Gia tri lon nhat = " << a[n-1] << endl;

}
Đề bài: Nhập n phần tử số nguyên. Nhập phần tử cần tìm kiếm X. Nếu trong n phần tử đã nhập có
X thì báo "tìm thấy", số lần tìm thấy và "các vị trí tìm thấy", ngược lại báo "không tìm thấy"
Ví dụ: mảng A gồm các phần tử (theo thứ tự chỉ số tăng dần từ 0) là 5, 2, 1, 6, 2, 4, 1, 3
giá trị tìm kiếm X = 2
vậy kết quả sẽ là: Tìm thấy 2 (2 lần) tại vị trí: 1, 4
Phân tích:
sau khi nhập mảng
ta sẽ đếm số lượng phần tử X có trong mảng
nếu đếm thấy có: tiến hành liệt kê các vị trí
ngược lại thì thông báo không có.
Đơn giản vậy thôi
ta sẽ chia các công việc ra từng hàm riêng
hàm nhập kinh điển
hàm đếm trả về số lượng phần tử có giá trị bằng giá trị cho trước
hàm liệt kê: tươg tự hàm trên, mỗi khi gặp a[i] bằng x thì in vị trí ra (vị trí là i)
Code C++ đây thực hành nào:
#include <iostream.h>
void NhapMang(int a[], int &n){
cout << "Nhap so luong phan tu cua mang: "; cin >> n;
for (int i = 0; i < n ; i++){
cout << "a[" << i << "] = "; cin >> a[i];
}
}
int DemSoLan(int a[], int n, int x) {
int kq = 0;
for (int i=0; i < n; i++) if (a[i] == x) kq++;
return kq;
}
void LietKe(int a[], int n, int x) {

for (int i = 0; i < n; i++) if (a[i] == x) cout << i << " ";
}
void main(){
int a[100], n, x, d;
NhapMang (a, n);
cout << "Gia tri tim kiem = "; cin >> x;
d == DemSoLan (a, n, x);
if (d > 0){
cout << "Tim thay " << x << " (" << d << " lan) tai vi tri: ";
LietKe (a, n, x);
}
else
cout << "Khong tim thay " << x;
}
Đề bài: Nhập n phần tử số nguyên. Nhập phần tử cần tìm kiếm X. Đưa ra màn hình "TÌM THẤY"
nếu có X trong mảng, ngược lại báo "KHÔNG THẤY"
#include <iostream.h>
void NhapMang(int a[], int &n){
cout << "Nhap N = "; cin >> n;
for (int i = 0; i < n ; i++){
cout << "a[" << i << "] = "; cin >> a[i];
}
}
int TimKiem(int a[], int n, int x) {
for (int i=0; i < n; i++) if(a[i]==x) return 1;
return 0;
}
void main(){
int a[100], n, x;
NhapMang (a, n);

cout << "Gia tri tim kiem = "; cin >> x;
if( TimKiem (a, n, x) ){
cout<<"TIM THAY";
else
cout<<"KHONG THAY";
}
Ví dụ về toán tử phẩy:
#include <iostream.h>
void main(){
int a, b=1 , c=10;
a= (1, 2, 3);
cout<<a<<endl; //in ra số 3 là giá trị biểu thức cuối cùng
a= (b++, c=c+50, c+1);
cout<<a<<endl //in ra số 61 là giá trị của c+1
<<b<<endl //in ra số 2
<<c<<endl; //in ra số 60
}
Tìm ước số chung lớn nhất của hai số nguyên được nhập từ bàn phím
Giải thích:
Tính ước số chung lớn nhất của 91 và 287.
Trước hết lấy 287 (số lớn hơn trong 2 số) chia cho 91:
287 = 91*3 + 14 (91 & 14 sẽ được dùng cho vòng lặp kế)
Nhận xét: bất kỳ số nào chia hết bởi 287 và 91 cũng sẽ chia hết bởi 287 - 91*3 = 14. Tương tự, số chia hết
bởi 91 và 14 cũng chia hết bởi 91*3 + 14 = 287. Do đó, ƯSCLN(91,287) = ƯSCLN(91,14). Bài toán trở thành
tìm ƯSCLN(91,14). Lặp lại quy trình trên cho đến khi phép chia không còn số dư như sau:
91 = 14*6 + 7 (14 & 7 sẽ được dùng cho vòng lặp kế)
14 = 7*2 (không còn số dư, kết thúc, nhận 7 làm kết quả)
Cuối cùng ta có: 7 = ƯSCLN(14,7) = ƯSCLN(91,14) = ƯSCLN(287,91).
#include <iostream.h>
#include <math.h>

int main()
{
int a,b;
cout<<"Nhap a,b"; cin>>a>>b;
int x= abs(a), y= abs(b), r;
while (y!=0)
{
r=x%y;
x= y;
y= r;
}
cout<<"USCLN="<<x;
}
Hoặc
Code:
#include <iostream.h>
#include <math.h>
int main()
{
int a,b;
cout<<"Nhap a,b"; cin>>a>>b;
a=abs(a);
b=abs(b);
while(a-b)
{
if (a>b)
a=a-b;
else
b=b-a;
}

cout<<"USCLN="<<a;
}
Muốn tìm bội số chung nhỏ nhất của hai số a,b ta tìm ước số chung lớn nhất của a và b. Sau đó lấy
tích a*b chia cho ước số chung đó.
#include <iostream.h>
#include <math.h>
int main()
{
int a,b;
cout<<"Nhap a,b"; cin>>a>>b;
int x= abs(a), y= abs(b), r;
while (y!=0)
{
r=x%y;
x= y;
y= r;
}
//x là ước số chung lớn nhất của a và b.
cout<<"USCLN="<<a*b/x;
}
bài toán hay! (của lớp 3)
Tìm số tự nhiên N có chữ số hàng đơn vị là d, biết khi chuyển chữ số hàng đơn vị lên đầu thì được
số mới có giá trị lớn gấp k lần N.
Lập trình tìm N với d và k nhập từ bàn phím
ta vd N là: là abcd, thì abcd x k = dabc
giả sử biết d=9 và k=2, ta suy ra được c=8, từ c=8 suy ra được b=7, từ b suy ra được a=5
cứ như thế ta sẽ tim được số N
#include <iostream.h>
void main(){
int a[100], d,k,i,j;

cout<<"so dv d=";
cin>>d;
cout<<"he so k="; cin>>k;
a[0]=d;
for(i=1; i<100; i++){
a[i]=(a[i-1]%10)*k + a[i-1]/10;
if(a[i]==d)break;
}
if((i<100)&&(a[i-1]%10!=0)){
cout<<"N=";
for(j=i-1;j>=0;j ) cout<<a[j]%10;
}else cout<<"khong co nghiem";
}
Bài tập: Nhập mảng n phần tử số nguyên, nhập giá trị m, in ra màn hình các số không lớn hơn m theo
thứ tự tăng dần, các số còn lại theo thứ tự giảm dần
Phân tích: Cho một ví dụ để các bạn hiểu yêu cầu nhé: Giả sử mảng nhập vào có 10 phần tử là: 2 9 8 3
7 4 6 5 1 0 và m là 6 thì cần phải in ra: 0 1 2 3 4 5 6 9 8 7
Bài này có nhiều cách giải, sau đây là 1 cách:
+khai báo mảng, khai báo biến số lương n, khai báo biến m
+Nhập mảng: nhập n, nhập n phần tử
+nhập m
+sắp xếp toàn bộ mảng theo thứ tự tăng dần
+tìm k là vị trí phần tử bé nhất trong mảng đã sắp xếp nhưng lớn hơn m
+từ k đến cuối mảng: sắp xếp giảm dần (có thể dùng thuật toán soi gương ở đây)
+in mảng ra màn hình sẽ được kết quả mong muốn.
#include <iostream.h>
void NhapMang(int *a, int &n){
cout << "Nhap N = "; cin >> n;
for (int i = 0; i < n ; i++){
cout << "a[" << i << "] = ";

cin >> a[i];
}
}
void sap_xep(int a[], int n, int m){
int i,j,k;
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if(a[i]>a[j]){
int tg=a[i];
a[i]=a[j];
a[j]=tg;
}
for(k=0; k<n; k++)
if(a[k]>m) break;
for(i=k; i<n-1; i++)
for(j=i+1; j<n; j++)
if(a[i]<a[j]){
int tg=a[i];
a[i]=a[j];
a[j]=tg;
}
}
void liet_ke(int a[], int n){
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
}
void main(){
int a[100], n, m;
NhapMang(a,n);
cout<<"nhap m="; cin>>m;

sap_xep(a,n,m);
liet_ke(a,n);
}
Các bước trong code trên là y hệt với quá trình phân tích, nên malyfo ko viết chú thích vào nữa hẳn các bạn
cũng hiểu cả!
phần trước có bài bài tập gptb2 với hệ số a, b, c bất kỳ, đã post 2 bài là gptb1 và gptb2 riêng biệt, nhưng
k thấy có bạn nào ghép nó lại cả
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
void gptb2(float a, float b, float c){
float d,x1,x2;
d=b*b-4*a*c;
if(d>=0){
x1=(-b-sqrt(d))/(2*a);
x1=(-b+sqrt(d))/(2*a);
cout<<"pt co 2 nghiem thuc"<<endl
<<"nghiem thuc 1="<<x1<<endl
<<"nghiem thuc 2="<<x2<<endl;
}
else{
cout<<"pt k co nghiem thuc\n";
cout<<"pt co 2 nghiem phuc lien hop"<<endl;
float thuc,ao;
thuc=-b/2/a;
ao=sqrt(-d)/2/a;
cout<<"nghiem ao 1="<<thuc<<"-i"<<ao<<endl;
cout<<"nghiem ao 2="<<thuc<<"+i"<<ao<<endl;
}
}

void gptb1(float a, float b){
if(a!=0)
cout<<"pt co 1 nghiem thuc x="<<(-b/a)<<endl;
else
if(b==0)
cout<<"pt co vo so nghiem"<<endl;
else
cout<<"pt khong co nghiem thuc";
}
void main(void){
float a,b,c;
cout<<"nhap 3 hs cua ptb2: ";
cin>>a>>b>>c;
if(a!=0)
gptb2(a,b,c);
else
gptb1(b,c);
}
Bài toán: Tìm tất cả các số tự nhiên "hoàn hảo" từ 1 đến n. n nhập từ bàn phím. số "hoàn hảo" là
số có giá trị bằng tổng các ước số của nó
ví dụ: số 6 = 3 + 2 + 1
Phân tích: lợi dụng sức trâu bò của máy: ta thử mọi số trong phạm vi từ 1 -> n . Nếu số nào thỏa tính chất
thì in nó ra
Ở đây việc chính là phải kiểm tra được tính "hoàn hảo" của số nguyên
vậy ta phải viết hàm kiểm tra đó, khi đó công việc liệt kê sẽ đơn giản.
#include <iostream.h>
int kiem_tra ( int x ){
int t = 0;
for ( int i = 1; i < x; i ++ ) //duyệt qua mọi số nguyên dương bé hơn số cần
kiểm tra

if ( x % i == 0 ) //x chia hết cho i, thì i là ước số của x
t += i; //tăng biến chứa tổng
return t == x; //so sánh: nếu tổng bằng x thì x là số hoàn hảo
}
void main(){
int n;
cout << "Nhap n = "; cin >> n;
cout << "Cac so tu nhien hoan hao: ";
for ( int i = 1; i <= n; i ++ )
if ( kiem_tra ( i ) )
cout << i << " ";
}
giờ viết cái hàm tìm kiếm nhị phân
với đầu vào là mảng đã sắp xếp tăng dần, nếu thấy trả về vị trí tìm thấy, nếu không tìm thấy thì trả về 0
Phân tích: với đầu vào là mảng đã sắp xếp tăng dần, khi bắt đầu tìm kiếm ta truyền vào left là chỉ số
đầu tiên ( thường là 0) và right là chỉ số của phần tử cuối cùng (có n phần tử, chỉ số của phần tử đầu là
0 thì chỉ số của phần tử cuối cùng là n-1 )
nếu giá trị x cần tìm lớn hơn giá trị giữa left và right ( m = (l+r)/2 )thì có nghĩa x ở bên phía phải, khi
đó thay biên trái (left) bằng giá trị giữa cộng 1 ( l = m + 1 )
ngược lại x ở bên trái, khi đó cập nhật biên phải
cho đến khi biên trái = biên phải thì dừng
kiểm tra lại x có bằng a[l] không? , nếu bằng thì trả về vị trí, ngược lại trả về 0
#include <iostream.h>
int tk_np(int a[], int x, int l, int r){
while(l<r){
int m = (l+r)/2;
if(x>a[m])
l=m+1;
else
r=m;

}
return (x == a[ l ]) ? (l+1) : 0;
}
void main(){
int a[]={1 , 2, 4, 5, 7, 8, 9, 10, 12, 13};
int x, k;
for(k = 0; k<10; k++) cout << a[k] << " ";
cout << endl;
cout << "Nhap gia tri can tim: ";
cin >> x;
if( k = tk_np(a, x, 0, 9) )
cout << x << " o vi tri: " << k << endl;
else
cout << " Khong co phan tu " << x << " trong mang " << endl;
}
Bài 6. Viết một chương trình nhập vào từ bàn phím điểm kiểm tra của một môn học của n học sinh và in kết
quả ra màn hình dưới dạng hai cột song song, một cột là điểm và cột thứ hai là xếp loại theo điểm với các
qui định sau:
Dưới 5: Yếu
Từ 5 đến dưới 7: Trung bình
Từ 7 đến dưới 9: Khá
Từ 9 trở lên: Giỏi
Giải:
#include <iostream.h>
#include <iomanip.h>
void main(){
clrscr();
float a[100];
int n;
cout<<"Nhap so hoc sinh N=";

cin>>n;
for (int i=0;i<n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
cout<<setprecision(0)<<setiosflags(ios::fixed);
cout<<endl;
cout<<setw(10)<<"TT"<<setw(10)<<"Diem"<<setw(20)<<"Xep loai"<<endl;
for (int i=0;i<n;i++)
{
char *xeploai;
if (a[i]<5)
xeploai="Yeu";
else if(a[i]<7)
xeploai="Trung Binh";
else if(a[i]<9)
xeploai="Kha";
else
xeploai="Gioi";
cout<<setw(10)<<i<<setw(10)<<a[i]<<setw(20)<<xeploai<<endl;
}
getch();
}
Đề Bài: Nhập mảng n phần tử số nguyên, kiểm tra xem mảng có phải là tăng dần không? nếu
không phải thì sắp xếp tăng dần. Nhập số nguyên cần tìm kiếm m, tìm kiếm theo thuật toán tìm
kiếm nhị phân. nếu thấy báo số lượng tìm thấy, vị trí tìm thấy, ngược lại thông báo không thấy.
Sau khi tìm xong, hỏi có tìm nữa khôg? nếu tìm nữa thì lại nhập m, rồi tìm y chang như trên cứ
thế cho đến khi trả lời là không muốn tìm nữa thì thôi
#include <iostream.h>

void NhapMang(int *a, int &n){
cout << "Nhap N = "; cin >> n;
for (int i = 0; i < n ; i++){
cout << "a[" << i << "] = ";
cin >> a[i];
}
}
void SapXep_TangDan(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 tg=a[i];
a[i]=a[j];
a[j]=tg;
}
}
int TimKiem_NhiPhan(int a[], int n, int x){
int i=0, j=n-1;
while(i<j){
int m = (i+j)/2;
if(x>a[m])
i=m+1;
else
j=m;
}
return (x == a[ i ]) ? i+1 : 0;
}
int KiemTra_TangDan (int a[], int n){
for( int i = 0; i < n - 1; i ++ ) if ( a[i] > a[i+1] ) return 0;
return 1;

}
void main(){
int a[100], n;
NhapMang(a, n);
if(! KiemTra_TangDan(a, n)) SapXep_TangDan(a, n);
int m, i;
cout << "Mảng sắp xếp tăng dần:";
for(i = 0; i < n; i++) cout << a[i] << " ";
cout << endl;
cout << "Nhap gia tri can tim: "; cin >> m;
if( i = TimKiem_NhiPhan(a, n, m) )
cout << m << " o vi tri: " << i << endl;
else
cout << " Khong co phan tu " << m << " trong day " << endl;
}
Chú ý là bài trên chưa có tìm số lượng.
và cũng chưa làm được "Sau khi tìm xong, hỏi có tìm nữa khôg? nếu tìm nữa thì lại nhập m, rồi tìm y chang
như trên cứ thế cho đến khi trả lời là không muốn tìm nữa thì thôi"
Giải quyết bài toán kiểu "Sau khi tìm xong, hỏi có tìm nữa khôg? nếu tìm nữa thì lại nhập m, rồi tìm y
chang như trên cứ thế cho đến khi trả lời là không muốn tìm nữa thì thôi"
cụ thể cho bài trên
Code:
//các hàm ở trên k post lại nhé
void main(){
int a[100], n;
NhapMang(a, n);
if(! KiemTra_TangDan(a, n)) SapXep_TangDan(a, n);
int m, i;
cout << "Mang sap xep tang dan:";
for(i = 0; i < n; i++) cout << a[i] << " ";

cout << endl;
char c;
do{
cout << "Nhap gia tri can tim: "; cin >> m;
if( i = TimKiem_NhiPhan(a, n, m) )
cout << x << " o vi tri: " << i << endl;
else
cout << " Khong co phan tu " << x << " trong day " << endl;
cout<<"Tim tiep khong? (c/k)"; cin>>c;
}while(c=='c'||c=='C');
}
Vậy cách chung để giải quyết là:
khai báo 1 biến kiểu ký tự để chứa trả lời
đặt công việc cần làm trong vòng lặp kiểm tra sau do - while
khi làm xong công việc thì hỏi lại người dùng có muốn chạy lại không? (c/k)
và nếu là Có thì sẽ làm lại!
char c;
do{
//làm công việc gì đó, mà khi làm xong hỏi có làm tiếp kô, nếu đồng ý sẽ làm lại
cout<<"Tim tiep khong? (c/k)"; cin>>c;
}while(c=='c'||c=='C');
Giải quyết công việc tìm số lượng của mỗi lần tìm kiếm nhị phân trong bài trên:
Phân tích: Ta có thể viết hàm tìm kiếm nhị phân như là 1 thủ tục như sau để có thể đếm luôn được số
lượng.
vì mảng đã sắp xếp tăng dần, nên khi tìm đc 1 phần tử bằng giá trị tìm kiếm, thì chỉ cần kiểm tra các phần
tử ngay sau nó, có bao nhiêu phần tử bằng giá trị tìm kiếm thì đó là số lượng cần tìm
Code:
void TimKiem_NhiPhan(int a[], int n, int x){
int i=0, j=n-1;
while(i<j){

int m = (i+j)/2;
if(x>a[m])
i=m+1;
else
j=m;
}
if(x == a[i]){
int soluong = 0;
int k=i;
while((x==a[k])&&(k++ < n))soluong++;
cout <<"Tim thay "<<x<<" xuat hien "<<soluong<<" lan trong mang"<<endl;
}else
cout <<"Khong tim thay "<<x<<" trong mang"<<endl;
}
và ghép lại toàn bộ sẽ là
Code:
#include <iostream.h>
void NhapMang(int *a, int &n){
cout << "Nhap N = "; cin >> n;
for (int i = 0; i < n ; i++){
cout << "a[" << i << "] = ";
cin >> a[i];
}
}
void SapXep_TangDan(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 tg=a[i];
a[i]=a[j];

a[j]=tg;
}
}
void TimKiem_NhiPhan(int a[], int n, int x){
int i=0, j=n-1;
while(i<j){
int m = (i+j)/2;
if(x>a[m])
i=m+1;
else
j=m;
}
if(x == a[i]){
int soluong = 0;
int k=i;
while((x==a[k])&&(k++ < n))soluong++;
cout <<"Tim thay "<<x<<" xuat hien "<<soluong<<" lan trong mang"<<endl;
}else
cout <<"Khong tim thay "<<x<<" trong mang"<<endl;
}
int KiemTra_TangDan (int a[], int n){
for( int i = 0; i < n - 1; i ++ ) if ( a[i] > a[i+1] ) return 0;
return 1;
}
void main(){
int a[100], n;
NhapMang(a, n);
if(! KiemTra_TangDan(a, n)) SapXep_TangDan(a, n);
int m, i, k;
cout << "Mang sap xep tang dan:";

for(i = 0; i < n; i++) cout << a[i] << " ";
cout << endl;
char c;
do{
cout << "Nhap gia tri can tim: "; cin >> m;
TimKiem_NhiPhan(a, n, m);
cout<<"Tim tiep khong? (c/k)"; cin>>c;
}while(c=='c'||c=='C');
}
Nhập mảng n phần tử số nguyên, tìm giá trị phần tử xuất hiện nhiều nhất trong mảng, nếu có
nhiều giá trị khác nhau cùng xuất hiện nhiều nhất thì liệt kê hết các giá trị đó ra.
ví dụ 1:
có 11 phần tử: 1 4 4 2 2 4 5 6 3 6 6
thì thông báo
giá trị 4 xuất hiện 3 lần
giá trị 6 xuất hiện 3 lần.
ví dụ 2:
có 12 phần tử: 1 2 3 3 3 2 2 3 3 4 4 5
thì thông báo
giá trị 3 xuất hiện 5 lần
Phân tích:
sau khi khai báo mảng rồi nhập mảng
ta dùng 1 mảng đếm, lưu số lần xuất hiện của từng phần tử
tức là d[i] = đếm số lần xuấthiện a[i] trong mảng a
sau đó tìm max trong mảng đếm
tức là max = MAX { d[i] }
giả sử max = d[k] thì giá trị xuất hiện max lần chính là a[k]
các bạn chú ý code sao cho không để tình trạng báo trùng kết quả nhé
đừng để với trường hợp
ví dụ 2:

có 12 phần tử: 1 2 3 3 3 2 2 3 3 4 4 5
lại thông báo 5 lần đều là
giá trị 3 xuất hiện 5 lần
giá trị 3 xuất hiện 5 lần
giá trị 3 xuất hiện 5 lần
giá trị 3 xuất hiện 5 lần
giá trị 3 xuất hiện 5 lần
Nhập mảng n phần tử số nguyên, tìm giá trị phần tử xuất hiện nhiều nhất trong mảng, nếu có
nhiều giá trị khác nhau cùng xuất hiện nhiều nhất thì liệt kê hết các giá trị đó ra.
ví dụ 1:
có 11 phần tử: 1 4 4 2 2 4 5 6 3 6 6
thì thông báo
giá trị 4 xuất hiện 3 lần
giá trị 6 xuất hiện 3 lần.
ví dụ 2:
có 12 phần tử: 1 2 3 3 3 2 2 3 3 4 4 5
thì thông báo
giá trị 3 xuất hiện 5 lần
Phân tích cách 2
sau khi có mảng n phần tử số nguyên
ta sắp xếp tăng dần(hoặc giảm dần cũng OK) mảng đó
khi đó cũng dùng mảng đếm d để lưu số lần xuất hiện của từng phần tử (chỗ này có khác đi 1 tí để dễ dàng
việc loại bỏ giá trị lặp hơn
bằng cách duyệt từ đầu đến hết mảng đã sắp xếp
mỗi khi gặp giá trị trùng (trùng thì đứng cạnh nhau do đã sắp xếp) thì tăng số biến đếm thôi
d[0]=1;
for( i = 1; i < n; i++ ) d[i] = ( a[i]=a[i-1] ) ? d[i-1]+1 : 1 ;
khi đó tìm max = giá trị max trong mảng d
rồi liệt kê lại các giá trị a[k] tương ứng với d[k] có giá trị bằng max
Nhập mảng n phần tử số nguyên, tìm giá trị phần tử xuất hiện nhiều nhất trong mảng,

nếu có nhiều giá trị khác nhau cùng xuất hiện nhiều nhất thì liệt kê hết các giá trị đó ra.
ví dụ 1:
có 11 phần tử: 1 4 4 2 2 4 5 6 3 6 6
thì thông báo
giá trị 4 xuất hiện 3 lần
giá trị 6 xuất hiện 3 lần.
ví dụ 2:
có 12 phần tử: 1 2 3 3 3 2 2 3 3 4 4 5
thì thông báo
giá trị 3 xuất hiện 5 lần
Phân tích cách 2
sau khi có mảng n phần tử số nguyên
ta sắp xếp tăng dần(hoặc giảm dần cũng OK) mảng đó
khi đó cũng dùng mảng đếm d để lưu số lần xuất hiện của từng phần tử (chỗ này có khác đi 1 tí
để dễ dàng việc loại bỏ giá trị lặp hơn
bằng cách duyệt từ đầu đến hết mảng đã sắp xếp
mỗi khi gặp giá trị trùng (trùng thì đứng cạnh nhau do đã sắp xếp) thì tăng số biến đếm thôi
d[0]=1;
for( i = 1; i < n; i++ ) d[i] = ( a[i]==a[i-1] ) ? d[i-1]+1 : 1 ;
khi đó tìm max = giá trị max trong mảng d
rồi liệt kê lại các giá trị a[k] tương ứng với d[k] có giá trị bằng max
#include <iostream.h>
void NhapMang(int *a, int &n){
cout << "Nhap N = "; cin >> n;
for (int i = 0; i < n ; i ++){
cout << "a[" << i << "] = ";
cin >> a[i];
}
}
void SapXep_TangDan(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 tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}
void Dem(int *a, int *d, int n){
d[0]=1;
for(int i = 1; i < n; i ++)
if( a[i] == a[i-1] )
d[i] = d[i-1] + 1;
else
d[i] = 1;
//d[i] = ( a[i]==a[i-1] ) ? d[i-1]+1 : 1 ;
}
int max(int *a, int n){
int m = a[0];
for(int i = 1; i < n; i ++) if (a[i] > m) m = a[i];
return m;
}
void LietKe(int *a, int *d, int n){
int m = max(d, n);
for(int k = 0; k < n; k ++)
if(d[k] == m)
cout<<"Gia tri "<<a[k]<<" xuat hien "<<m<<" lan"<<endl;
}
void main(){
int a[100], d[100], n;

NhapMang(a, n);
SapXep_TangDan(a, n);
Dem(a, d, n);
LietKe(a, d, n);
}
Viết chương trình đọc và 2 số nguyên và in ra kết quả của phép (+), phép trừ (-), phép nhân (*),
phép chia (/). Nhận xét kết quả chia 2 số nguyên.
#include<iostream.h>
#include<math.h>
int main()
{
int a,b; //hai toan hang a,b
char ch;//dau cua phep toan
int s;
cout<<"Nhap a="; cin>>a;
cout<<"Nhap b="; cin>>b;
cout<<"Nhap toan hang ch="; cin>>ch;
switch (ch)
{
case '+':
s=a+b;
cout<<a<<ch<<b<<"="<<s;
break;
case '-':
s=a-b;
cout<<a<<ch<<b<<"="<<s;
break;
case '*':
s=a*b;
cout<<a<<ch<<b<<"="<<s;

break;
case '/':
if(b!=0)//Neu b<>0 thi a/b
{
s=a/b;
cout<<a<<ch<<b<<"="<<s;
}
else
cout<<"Khong thuc hien phep chia";
break;
default:
cout<<"Khong thuc hien duoc";
}
}
Viết chương trình nhập vào bán kính hình cầu, tính và in ra diện tích, thể tích của hình cầu đó. Hướng dẫn: S
= 4*PI*R*R và V = (4/3)*PI*R*R*R.
#include<iostream.h>
const float PI=3.1415;
int main()
{
float r,s,v;
do
{
cout<<"Nhap ban kinh R="; cin>>r;
}while(r<=0);
s=4*PI*r*r;
v=4*PI*r*r*r/3;
cout<<endl<<"Dien tich s="<<s;
cout<<endl<<"The tich v="<<v;
}

Viết chương trình nhập vào một số a bất kỳ và in ra giá trị bình phương (a2), lập phương (a3) của a và giá trị
(a4).
Code:
#include<iostream.h>
#include<math.h>
int main()
{
double a;
cout<<"Nhap a=";
cin>>a;
double a2,a3,a4;
a2=pow(a,2);
a3=pow(a,3);
a4=pow(a,4);
cout<<endl<<"a2="<<a2;
cout<<endl<<"a3="<<a3;
cout<<endl<<"a4="<<a4;
}
Viết chương trình nhập vào số giây từ 0 đến 86399, đổi số giây nhập vào thành dạng "gio:phut:giay", mỗi
thành phần là một số nguyên có 2 chữ số. Ví dụ: 02:11:05
Code:
#include<iostream.h>
int main()
{
long int num;
int h,m,s;
cout<<"Nhap so:"; cin>>num;
//S la so giay
s=num%60;
num=num/60;

//m la so phut
m=num%60;
num=num/60;
//h la so gio
h=num%60;
num=num/60;
//Neu h<10 phai them so 0 dang truoc
if (h<10)
cout<<"\n0"<<h;
else
cout<<h;
if (m<10)
cout<<":0"<<m;
else
cout<<":"<<m;
if (s<10)
cout<<":0"<<s;
else
cout<<":"<<s;
}
Viết chương trình nhập vào số nguyên dương, in ra thông báo số chẵn hay lẻ. Hướng dẫn: Nhập
vào số nguyên dương x. Kiểm tra nếu x chia chẵn cho hai thì x là số chẵn (hoặc chia cho 2 dư 0)
ngược lại là số lẻ.
#include<iostream.h>
int main()
{
int x;
do
{
cout<<"Nhap X="; cin>>x;

}while(x<=0);
if (x%2==0)
cout<<"X la so chan";
else
cout<<"X la so le";
}
Viết chương trình nhập vào 4 số nguyên. Tìm và in ra số lớn nhất.
#include<iostream.h>
int main()
{
int a,b,c,d;
cout<<"Nhap a,b,c,d";
cin>>a>>b>>c>>d;
int max,m1,m2;
max=(m1=(a>b)?a:b)>(m2=(c>d)?c:d)?m1:m2;
/*
Hoac
m1=(a>b)?a:b);
m2=(c>d)?c:d);
max=m1>m2?m1:m2;
*/
cout<<"Max="<<max;
}
Bài 5: Viết chương trình nhập vào số giây, đổi số giây nhập vào thành dạng "gio:phut:giay", mỗi
thành phần là một số nguyên có 2 chữ số.
Code:
#include <iostream.h>
void main(){
long t;
cout<<"Nhap tong so giay can quy doi:"; cin>>t;

int s = t%60;
int m = t/60%60;
int h = t/60/60%24;
if(h<10)cout<<0; cout<<h<<':';
if(m<10)cout<<0; cout<<m<<':';
if(s<10)cout<<0; cout<<s;
}
Nếu muốn viết ra giờ:phút:giây am/pm
thì ta chỉnh một chút như sau:
#include <iostream.h>
void main(){
long t;
cout<<"Nhap tong so giay can quy doi:"; cin>>t;
int s = t%60;
int m = t/60%60;
int h = t/60/60%24;
if(h<10)cout<<0;
if(h>12)cout<<(h-12)<<':'; else cout<<h<<":";
if(m<10)cout<<0; cout<<m<<':';
if(s<10)cout<<0; cout<<s;
if(h>12)cout<<" pm"; else cout<<" am";
}
Bài 5: Viết chương trình nhập vào số giây, đổi số giây nhập vào thành dạng
"gio:phut:giay", mỗi thành phần là một số nguyên có 2 chữ số.
Code:
#include <iostream.h>
void main(){
long t;
cout<<"Nhap tong so giay can quy doi:"; cin>>t;
int s = t%60;

int m = t/60%60;
int h = t/60/60%24;
if(h<10)cout<<0; cout<<h<<':';
if(m<10)cout<<0; cout<<m<<':';
if(s<10)cout<<0; cout<<s;
}
Nếu muốn viết ra giờ:phút:giây am/pm
thì ta chỉnh một chút như sau:
Code:
#include <iostream.h>
void main(){
long t;
cout<<"Nhap tong so giay can quy doi:"; cin>>t;
int s = t%60;
int m = t/60%60;
int h = t/60/60%24;
if(h<10)cout<<0;
if(h>12)cout<<(h-12)<<':'; else cout<<h<<":";
if(m<10)cout<<0; cout<<m<<':';
if(s<10)cout<<0; cout<<s;
if(h>12)cout<<" pm"; else cout<<" am";
}
Áp dụng bài trên, viết 1 hàm quy đổi, in ra thời gian vào và ra của lịch học buổi sáng
tiết 1 bắt đầu vào lúc 6h30 sáng
Code:
#include <iostream.h>
void qd(long t){
int s = t%60;
int m = t/60%60;
int h = t/60/60%24;

if(h<10)cout<<0;
if(h>12)cout<<(h-12)<<':'; else cout<<h<<":";
if(m<10)cout<<0; cout<<m<<':';
if(s<10)cout<<0; cout<<s;
if(h>12)cout<<" pm"; else cout<<" am";
cout<<endl;
}
void main(){
long t=(long)6*60*60 + 30*60;
cout<<"vao t1="; qd(t); t+=45*60;
cout<<" ra t1="; qd(t); t+=5*60;
cout<<"vao t2="; qd(t); t+=45*60;
cout<<" ra t2="; qd(t); t+=5*60;
cout<<"vao t3="; qd(t); t+=45*60;
cout<<" ra t3="; qd(t); t+=10*60;
cout<<"vao t4="; qd(t); t+=45*60;
cout<<" ra t4="; qd(t); t+=5*60;
cout<<"vao t5="; qd(t); t+=45*60;
cout<<" ra t5="; qd(t); t+=5*60;
cout<<"vao t6="; qd(t); t+=45*60;
cout<<" ra t6="; qd(t);
}
Viết chương trình vẽ một tam giác cân bằng các dấu *
Bài này bạn hãy sử dụng phối hợp 2 vòng lặp lồng nhau, hãy xem xét từng hàng để rút ra quy luật
cho vòng lặp (quy nạp)
Ví dụ : bạn thấy
- hàng i=1 : xuất n-1 " ", rồi xuất 1 "* "
- hàng i=2 : xuất n-2 " ", xuất 1 "*", tiếp tục xuất 1 " ", rồi xuất 1 "*"
- hàng i=3 : xuất n-3 " ", xuất 1 "*", tiếp tục xuất 3 " ", rồi xuất 1 "*"
- hàng i=4 : xuất n-4 " ", xuất 1 "*", tiếp tục xuất 5 " ", rồi xuất 1 "*"


Như vậy ta thấy có quy luật :
Hàng i : xuất n-i " ", xuất 1 "*", tiếp tục xuất 2(i-1)-1 " ", rồi xuất 1 "*"
Tuy nhiên hàng 1 và n có chút khác biệt, ta cần thêm điều kiện cho đúng.
Ví dụ in ra tam giác toàn dấu *
Code:
#include "iostream.h"
void main ()
{
int n;
cout<< " n = "; cin>> n;
int i,j;
for (i = 1 ; i <=n ; i++ )
{
for (j = 1 ; j <=n-i ; j++ ) cout<< " ";
cout<< "*";
for (j = 0 ; j < 2*(i-1)-1 ; j++) cout<< "*";
if (i > 1)
cout<< "*";
cout<< endl;
}
}
In ra tam giác không có dấu * ở trong tam giác
Code:
#include "iostream.h"
void main ()
{
int n;
cout<< " n = ";
cin>> n;

int i,j;
for (i = 1 ; i <=n ; i++ )
{
//In ra n-i khoảng trắng trước dấu * mỗi dòng
for (j = 1 ; j <=n-i ; j++ ) cout<< " ";

//In ra dấu * đầu tiên
cout<< "* ";

//In ra các khoảng trắng ở giữa
for (j = 1 ; j <=2*(i-1)-1 ; j++)
{
//Nếu là dòng cuối cùng i=n, in ra toàn bộ cả dòng là dấu *
if (i==n)
cout<<"* ";
else
cout<< " ";
}
//Nếu không phải là dòng đầu tiền thì in dấu * thứ hai (cuối dòng)
if (i > 1)
cout<< "* ";
cout<< endl;
}
}
Nhập vào số nguyên dương n. In ra màn hình các số nguyên tố từ 1 đến n
Bài này chưa có thuật toán nào hay hơn sàng Eratosthene là một giải thuật cổ xưa để lập bảng tất
cả các số nguyên tố nhỏ hơn một số n cho trước. Giải thuật dựa trên tính chất: mọi hợp số m đều
có ước nguyên tố không vượt quá căn bậc hai của m. Giải thuật đầu tiên xóa số 1 ra khỏi tập các
số nguyên tố. Số tiếp theo số 1 là số 2, là số nguyên tố. Bắt đầu từ số 2 xoá tất cả các bội của 2 ra
khỏi bảng.Số đầu tiên không bị xoá sau số 2 (số 3) là số nguyên tố. Tiếp theo lại xoá các bội của

3 Tất cả các số chưa bị xoá là số nguyên tố.
Với bài toán của bạn có thể cài đặt giải thuật này như sau:
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
int main()
{
int N;
cout<<"Nhap N: "; cin>>N;
char *a = new char(N+1);
int i, j;
for(i = 2; i <= N/2; i++)
//if(!a[i])
for(j = i+i; j < N; j += i)
a[j] = 1;
for(i = 2; i <= N; i++)
if(!a[i])
cout<<setw(10)<<i;
cout<<endl;
}
Hoặc
#include<iostream.h>
#include<iomanip.h>
//Ham kiểm tra n có phải là số nguyên tố không
int nguyento(int n)
{
if (n<2)
{
return 0;
}

int d=0;
for(int i=2;i<=int(n/2);i++)
if (n%i==0)
{
d++;
}
return d;
}
void main()
{
int n;
cout<<"Nhap N="; cin>>n;
int a[n];

for(int i=0;i<n;i++)
a[i]=0;
for(int i=0;i<n;i++)
if(nguyento(i))//Nếu i KHÔNG là số nguyên tố thì gán a[i]=0
a[i]=0;
else
a[i]=1; //i là số nguyên tố
for(int i=2;i<n;i++)
if (a[i]) //Nếu a[i]==1, nghĩa là i là số nguyên tố thì in
cout<<setw(10)<<i;
cout<<endl;
}
Viết chương trình nhập vào số tự nhiên N rồi thông báo lên màn hình số đó có phải là số nguyên tố
hay không.
Giải thuật:
- N div 2 lưu vào biến d.→Đếm số ước số của N từ 2

- Nếu d=0 thì N là số nguyên tố.
#include<iostream.h>
#include<iomanip.h>
void main()
{
int n;
cout<<"Nhap N="; cin>>n;
if (n<2)
{
cout<<n<<" khong phai la so nguyen to";
return 0;
}
int d=0;
for(int i=2;i<=int(n/2);i++)
if (n%i==0)
{
d++;
}
if (d==0)
cout<<setw(10)<<n<<" la so nguyen to";
else
cout<<setw(10)<<n<<" KHONG la so nguyen to";
}
Đề bài: Viết chương trình nhập vào số tự nhiên N rồi thông báo lên màn hình số đó có phải là số
nguyên tố hay không.
Phân tích: ta biết số nguyên tố chỉ chia hết cho 1 và chính nó. vậy khi số nguyên N không là số nguyên tố,
thì x là hợp số, tức là N=a.b , và không mất tính tổng quát ta có thể giả sử a<=b. Khi đó max(a) = b, và N =
a . a Vậy ta suy ra giá trị lớn nhất của a là căn bậc 2 của N
Nên ta chỉ cần kiểm tra các số nguyên trong khoản từ 2 đến căn bậc 2 của N, nếu tồn tại 1 giá trị i mà N chia
hết cho i thì kết luận N không phải số nguyên tố, ngược lại thì N là số nguyên tố

#include <iostream.h>
#include <math.h>
int kiemtra_snt ( int x ) {
for ( int i=2; i <= sqrt( x ); i++ )
if ( x % i == 0 ) return 0;
return 1;
}
void main(){
int n;
cout << "Nhap gia tri can kiem tra tinh nguyen to: ";
cin >> n;
if ( kiemtra_snt ( n ) )
cout << n << " la so nguyen to";
else
cout << n << " KHONG la so nguyen to";

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×