Tải bản đầy đủ (.pdf) (46 trang)

(Skkn 2023) giúp học sinh tiếp cận một số bài toán số học, xử lý xâu bằng ngôn ngữ lập trình c++ nhằm nâng cao chất lượng học sinh giỏi môn tin học thpt

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 (1.57 MB, 46 trang )

SÁNG KIẾN KINH NGHIỆM
Đề tài:
GIÚP HỌC SINH TIẾP CẬN MỘT SỐ BÀI TỐN SỐ HỌC,
XỬ LÝ XÂU BẰNG NGƠN NGỮ LẬP TRÌNH C++ NHẰM
NÂNG CAO CHẤT LƯỢNG HỌC SINH GIỎI MƠN
TIN HỌC THPT

Mơn/Lĩnh vực: Tin học


SỞ GIÁO DỤC & ĐÀO TẠO NGHỆ AN
Đơn vị: Trường THPT Phan Đăng Lưu

SÁNG KIẾN KINH NGHIỆM
Đề tài:
GIÚP HỌC SINH TIẾP CẬN MỘT SỐ BÀI TOÁN SỐ HỌC,
XỬ LÝ XÂU BẰNG NGƠN NGỮ LẬP TRÌNH C++ NHẰM
NÂNG CAO CHẤT LƯỢNG HỌC SINH GIỎI
MƠN TIN HỌC THPT

Mơn/Lĩnh vực: Tin học
Người thực hiện: Trần Thị Hương
Tổ: Toán – Tin
Điện thoại: 0964627715

Năm học: 2022 – 2023


MỤC LỤC
Phần 1. ĐẶT VẤN ĐỀ ............................................................................................ 1
1. Lý do chọn đề tài ................................................................................................... 1


2. Mục đích nghiên cứu ............................................................................................. 1
3. Đối tượng nghiên cứu ............................................................................................ 1
4. Phương pháp nghiên cứu ....................................................................................... 1
5. Phạm vi nghiên cứu .............................................................................................. 2
6. Tính mới của đề tài ............................................................................................... 2
Phần 2. NỘI DUNG ĐỀ TÀI .................................................................................. 2
1. Cơ sở lý luận và thực tiễn...................................................................................... 2
1.1 Cơ sở lý luận ................................................................................................... 2
1.2 Cơ sở thực tiễn ................................................................................................ 2
2. Nội dung vấn đề nghiên cứu ................................................................................. 3
2.1 BÀI TẬP SỐ HỌC .......................................................................................... 3
2.1.1 Bài tập về ước chung lớn nhất................................................................... 3
2.1.2 Bài tập về cấp số cộng ............................................................................... 7
2.1.3 Bài tập về số nguyên tố ............................................................................. 8
2.1.4 Bài tập về giai thừa.................................................................................. 12
2.1.5 Bài tập về số hồn hảo ............................................................................ 13
2.1.6 Bài tập về số chính phương ..................................................................... 16
2.1.7 Bài tập về số phong phú .......................................................................... 17
2.1.8 Bài tập về số đẹp ..................................................................................... 19
2.1.9 Bài tập về số thân thiện ........................................................................... 20
2.2 BÀI TẬP XÂU ................................................................................................ 22
2.2.1 Các kiến thức cơ bản về xâu ................................................................... 22
2.2.2 Bài tập xâu ............................................................................................... 24
Phần 3. KẾT LUẬN VÀ KIẾN NGHỊ ................................................................ 35
1. Kết luận ............................................................................................................... 35
2. Kiến nghị ............................................................................................................. 35
TÀI LIỆU THAM KHẢO .................................................................................... 35
PHỤ LỤC ............................................................................................................... 36



Phần 1. ĐẶT VẤN ĐỀ
1. Lý do chọn đề tài
Sự phát triển mạnh mẽ như vũ bão của tin học đã làm cho xã hội có nhiều nhận
thức mới về cách tổ chức các hoạt động. Nhiều quốc gia trên thế giới ý thức được
rất rõ tầm quan trọng của tin học và có những đầu tư lớn cho lĩnh vực này, đặc biệt
trong giáo dục nâng cao dân trí về tin học và đào tạo nguồn nhân lực có chất lượng
cao. Người Việt Nam có nhiều tố chất thích hợp với ngành khoa học này, vì thế
chúng ta hi vọng có thể sớm hồ nhập với khu vực và trên thế giới.
Tin học ngày càng có nhiều ứng dụng trong hầu hết các lĩnh vực hoạt động của
xã hội lồi người. Tuy nhiên, Tin học là một mơn học khó vì cơ sở của nó là tốn
học, bài tập rất đa dạng và phong phú, việc học sinh của trường đi thi học sinh giỏi
và để giành được giải không phải là đơn giản, do vậy giáo viên phụ trách đội tuyển
cần nhiều kinh nghiệm và kiến thức sát với nội dung ơn thi để nâng cao thành tích
đội tuyển tham gia các đợt thi học sinh giỏi hàng năm, Và để có được kết quả tốt cần
có một q trình nghiên cứu, học tập về ngơn ngữ lập trình và chọn một ngơn ngữ
lập trình thích hợp.
Hiện nay có rất nhiều ngơn ngữ lập trình bậc cao như: Pascal, Java, Basic, C,
C++,.... Tuy nhiên điều cơ bản của C++ là cho phép người lập trình hiểu và quản lí
các chương trình lớn, phức tạp. Vì vậy, nó được sử dụng nhiều trong các kỳ thi học
sinh giỏi Tin học.
Xuất phát từ cơ sở trên, tôi đã chọn đề tài “GIÚP HỌC SINH TIẾP CẬN MỘT SỐ
BÀI TOÁN SỐ HỌC, XỬ LÝ XÂU BẰNG NGƠN NGỮ LẬP TRÌNH C++ NHẰM
NÂNG CAO CHẤT LƯỢNG HỌC SINH GIỎI MÔN TIN HỌC THPT”.
2. Mục đích nghiên cứu
Qua quá trình tham gia giảng dạy, bồi dưỡng học sinh giỏi và việc nghiên cứu
các vấn đề về lập trình theo từng dạng bài tập từ cơ bản đến phức tạp của ngơn ngữ
lập trình C++, các tài liệu về phương pháp giảng dạy phục vụ cho việc học tập, ôn
thi học sinh giỏi của học sinh cũng như giảng dạy của giáo viên, tôi đã giải các bài
tốn bằng ngơn ngữ lập trình C++ với hệ thống lập trình CodeBlocks. Từ đó, tơi đưa
ra đề tài “Giúp học sinh tiếp cận một số bài tốn số học, xử lý xâu bằng ngơn ngữ

lập trình C++ nhằm nâng cao chất lượng học sinh giỏi môn tin học trung học phổ
thông” với mong muốn phần nào giúp học sinh cũng như giáo viên có thêm tài liệu
tham khảo phục vụ cho việc học tập và giảng dạy, ôn thi HSG.
3. Đối tượng nghiên cứu
Một số bài tốn số học, xử lý xâu bằng ngơn ngữ lập trình C++ nhằm nâng
cao chất lượng học sinh giỏi mơn tin học trung học phổ thông.
4. Phương pháp nghiên cứu.

1


Kinh nghiệm bản thân qua các kỳ ôn thi HSG, nghiên cứu các tài liệu về C++
qua sách tham khảo, mạng internet, sưu tầm tài liệu, thử nghiệm thực tế, rút kinh
nghiệm từ các tiết dạy bồi dưỡng HSG.
5. Phạm vi nghiên cứu
Đề tài chủ yếu nghiên cứu giải một số bài toán số học, xử lý xâu từ cơ bản đến
nâng cao bằng ngơn ngữ C++.
Đề tài có khả năng áp dụng rộng rãi vào giảng dạy, bồi dưỡng học sinh giỏi Tin
học cho giáo viên và học sinh THPT trên địa bàn toàn tỉnh Nghệ An.
Nghiên cứu thực tiễn và thăm dị tính cấp thiết, tính khả thi của đề tài ở một số
giáo viên Tin học Trường trung học phổ thông tỉnh Nghệ An: Trường THPT Yên
Thành 2, Trường THPT Nam Yên Thành, trường THPT Phan Đăng Lưu.
6. Tính mới của đề tài
- Đề tài nghiên cứu về vận dụng các kiến thức đã học về thuật tốn, từ đó viết chương
trình trên ngơn ngữ lập trình C++
- Mô tả được thực trạng về vấn đề cấp thiết cho cho học sinh THPT ở cách học lập
trình và lựa chọn ngơn ngữ lập trình đặc biệt là trong các kỳ thi học sinh giỏi Tỉnh.
Phần 2. NỘI DUNG ĐỀ TÀI
1. Cơ sở lý luận và thực tiễn
1.1. Cơ sở lí luận:

C++ được biết đến như là ngơn ngữ mới bao trùm lên C và do Bjarne Stroustrup
sáng tác ra vào năm 1980 tai bang New Jersey, Mĩ. Lúc đầu ông đặt tên là “C với
các lớp”, tuy nhiên đến năm 1983 thì ơng đổi tên thành C++. Trong C++ chẳng
những đưa vào tất cả các khái niệm, cơng cụ của lập trình hướng đối tượng mà cịn
đưa vào nhiều khả năng mới mẻ cho hàm. Nó có một thư viện hàm chứa mã đối
tượng cho những hàm đã được tạo sẵn. Những hàm này thực hiện các tác vụ thường
dùng như nhập một chuổi ký tự từ bàn phím (gets()), tính căn bậc hai (sqrt()), ...
mà chương trình được viết có thể sử dụng mà khơng phải viết lại.
1.2. Cơ sở thực tiễn:
Qua thực tế giảng dạy ở trường THPT các năm qua, tôi nhận thấy khi học đến
chương trình NNLT tin học lớp 11 đa số học sinh đều nhận xét bộ mơn này rất khó.
Tuy nhiên cũng có một số lượng khơng nhỏ học sinh rất u thích tin học và
thích tìm hiểu một số bài toán, cách giải các bài toán bằng NNLT. Trong chương
trình phổ thơng NNLT Pascal đang được giảng dạy cho HS khối 11, nhưng tôi thấy
NNLT C++ rất thuận tiện và có nhiều lợi thế khi dạy bồi dưỡng học sinh giỏi và
giúp học sinh giải các bài toán phức tạp thuận tiện hơn. Ngoài ra trong các đề thi học
sinh giỏi tỉnh các năm qua, chủ đề xâu dữ liệu là một nội dung trọng tâm, đa số đề
thi đều có các dạng bài thuộc kiểu xâu, bài tốn số học: Số bạn bè, số thân thiện, số

2


đẹp….Vì vậy tơi đã đầu tư nghiên cứu các nội dung, các dạng bài tập và mạnh dạn
viết về đề tài này.
2. Nội dung vấn đề nghiên cứu
Ví dụ: Bài tập đơn giản “Chương trình Hello World” Viết ra màn hình dịng chữ
Hello world
#include <iostream>
using namespace std;
int main()

{
cout << "Hello world!" << endl;
return 0;
}
Kết quả chương trình:

Một chương trình C++ cơ bản thường được bắt đầu bởi dòng include khai báo
thư viện, sau đó là hàm main.
Có rất nhiều kiểu dữ liệu trong C++, đối với các bạn mới bắt đầu và để làm các bài
tập cơ bản thì nên tìm hiểu trước về kiểu dữ liệu int, long, long
long, float, double, long double, char, string,
2.1 BÀI TẬP SỐ HỌC
2.1.1 BÀI TẬP VỀ ƯỚC CHUNG LỚN NHẤT (UCLN)
Bài 1: Nhập vào 2 số nguyên A và B, viết chương trình tìm ước chung lớn nhất của
2 số đó.
Trong bài này chúng ta có thể sử dụng cách giải tìm ước chung lớn nhất trong
C++, bằng cách sử dụng thuật toán loại trừ hoặc thuật tốn Euclid hoặc bằng hàm
__gcd có sẵn trong thư viện algorithm của C++
Ví dụ
Input : A = 20, B = 15
Output : 5

3


* Tìm UCLN bằng phương pháp trừ
Ý tưởng của thuật toán này là trừ hai số A và B cho nhau tới khi hai số này bằng
nhau. Lúc này ta sẽ tìm được UCLN của 2 số. Các bước triển khai thuật tốn sẽ như
sau:
-


Kiểm tra A hoặc B có bằng 0 hay không? Nếu bằng 0 trả về UCLN là A+B.
Dừng chương trình.

Lặp cho tới khi A = B. Với mỗi vịng lặp thì biến biến max(A, B) = giá trị
max(A, B) - giá trị min(A, B).
#include <bits/stdc++.h>
using namespace std;
-

int UCLN(int A, int B) {
if (A == 0 || B == 0)
return A + B;
while(A != B) {
if (A > B) {
A -= B;
}else{
B -= A;
}
}
return A;
}
int main()
{
int A,B;
A = 20;
B = 15;
cout << UCLN(A, B);
}
Kết quả chương trình:


* Tìm UCLN sử dụng thuật tốn Euclid
Giải thuật Euclid, hay Thuật tốn Euclid là một giải thuật giúp tính UCLN của hai
số một cách hiệu quả.
4


Thuật toán Euclid
Thuật toán Euclid là một giải thuật giúp chúng ta tìm ước chung lớn nhất của 2 số.
Nó được triển khai dựa trên tính chất của UCLN đó là UCLN(A, B) = UCLN(B,
A%B).
Ý tưởng triển khai thuật toán này sẽ quy nạp cho tới khi A % B = 0.
#include <bits/stdc++.h>
using namespace std;

int UCLN(int A, int B) {
if (B == 0)
return A;
return UCLN(B, A%B);
}
int main() {
int A,B;
A = 20;
B = 15;
cout << UCLN(A, B);
}
Kết quả chương trình: 5
-> Đây là cách tối ưu để giải các bài toán với dữ liệu lớn.
* Tìm UCLN bằng hàm có sẵn trong C/C++
Ngồi cách tự viết các hàm tìm uớc chung lớn nhất, chúng ta cịn có thể sử dụng

hàm __gcd có sẵn trong thư viện algorithm của C/C++.
Chương trình:
#include<iostream>
#include<algorithm>
using namespace std;
5


int main() {
int A,B;
A = 20;
B = 15;
cout << __gcd(A, B);
}
Kết quả chương trình: 5
Đây là cách nhanh nhất để giải bài tốn trong C/C++, ngồi tìm ước chung lớn nhất
thư viện algorithm cịn có nhiều hàm hỗ trợ khác cho giải các bài toán như max, min,
sort,...
Bài 2:
Cho dãy A gồm N số tự nhiên. Tìm ước chung lớn nhất của dãy số đó.
- Dữ liệu vào gồm:
+ Dịng thứ nhất là số nguyên dương N
+ Các dòng tiếp theo các phần tử của dãy
- Kết qua ra là ước chung lớn nhất của dãy.
VD: Nhap N = 5
a[0] = 3
a[1] = 6
a[2] =12
a[3] =15
a[4] =9

Chương trình:
#include <iostream>
using namespace std;
int UCLN(int a, int b) {
if(a==b)
return a;
else if(a>b)
return UCLN(a-b,b);
else
return UCLN(a,b -a);
}
int UC(int a[], int n) {
if(n==1)
6


return a[0];
else
return UCLN(a[n-1],UC(a,n-1));
}
int main() {
int a[30], n;
cout<<"Nhap n = "; cin>>n;
for(int i=0; icout<<"a["<cin>>a[i];
}
cout<<"UCLN cua "<}
Kết quả chương trình:


2.1.2 BÀI TẬP VỀ CẤP SỐ CỘNG
Bài 1. Viết chương trình nhập số nguyên dương N và dãy số nguyên A1, A2, A3,
…,An. Kiểm tra xem dãy vừa nhập có phải là cấp số cộng hay khơng, Nếu đúng thì
ghi số 1, ngược lại ghi số 0.
Ví dụ:
Dữ liệu vào

Kết quả

Dữ liệu vào

Kết quả

5

1

6

0

3 5 7 9 11

1 3 5 6 8 10

Chương trình:

7



#include<bits/stdc++.h>
#define max 10000
using namespace std;
int main()
{
int n;cin>>n;
int A[max] ;
for(int i=0;i<n;i++) cin>>A[i];
int d;
d=A[1]-A[0];
bool x=true;
for(int i=2;iif(A[i]!=A[i-1]+d)
{
x=false;
}}
if(x) cout<<"1"; else cout<<"0";
return 0;
}
Kết quả chương trình:

2.1.3 BÀI TẬP VỀ SỐ NGUYÊN TỐ
Định nghĩa Số nguyên tố trong lập trình:
Số nguyên tố là số tự nhiên lớn hơn 1, chỉ có 2 ước là 1 và chính nó. Hay nói cách
khác Số ngun tố là số nguyên dương có duy nhất 2 ước phân biệt là 1 và chính nó.
Bài 1. Nhập vào số ngun dương N, Tìm và đưa ra số nguyên tố lớn hơn N.
Ví dụ:
Dữ liệu vào


Kết quả

Dữ liệu vào

Kết quả

7

11

14

17

Chương trình:
#include<bits/stdc++.h>
using namespace std;
bool songto(int n)
8


{
if(n<2) return false;
for(int i=2;i*i<=n;i++)
if(n%i==0) return false;
return true;
}
int main()
{
int N;

cin>>N; N=N+1;
while(songto(N)==false) N++;
cout<return 0;
}
Kết quả chạy chương trình:

Bài 2:

Số nguyên tố đối xứng

Một số nguyên dương T được gọi là số nguyên tố đối xứng nếu thỏa mãn các yêu
cầu sau:
- T là một số nguyên tố
- T là một số đối xứng (đọc T từ trái qua phải thu được kết quả giống như đọc
T từ phải qua trái). Ví dụ 12321 là 1 số đối xứng.
Yêu cầu: cho 2 số nguyên dương A và B (104 ≤ A < B <105 ), hãy tìm số lượng các
số nguyên tố đối xứng T thỏa mãn A ≤ T ≤ B
Ví dụ:
Dữ liệu vào

Kết quả

11111 22222

23

Chương trình
#include <iostream>
using namespace std;

bool sodoixung(int a)
{
int s = 0;
int n = a;
while (n > 0)
9


{
s = s * 10 + n % 10;
n = n / 10;
}
if (s == a)
return true;
return false;
}
bool songto(int a)
{
if (a < 2)
return false;
for (int i = 2; i * i <= a; i++)
if (a % i == 0)
return false;
return true;
}
int main()
{
int A, B;
cin >> A >> B;
int dem = 0;

while (A <= B)
{
if (songto(A) == true)
{
if (sodoixung(A) == true)
dem++;
}
A++;
}
cout << dem;
return 0;
}
Kết quả chạy chương trình:

Bài 3:

TÌM SỐ

Cho số nguyên dương X, khi đảo ngược trật tự các chữ số của X ta sẽ thu được
một số nguyên dương Y, Y được gọi là số đảo ngược của X.

10


Ví dụ: X = 613 thì Y = 316 là số đảo ngược của X.
Số nguyên dương Y được gọi là số nguyên tố nếu nó chỉ có hai ước số là 1 và
chính nó, số 1 khơng phải là số nguyên tố.
Cho hai số nguyên dương P và Q (1 ≤ P ≤ Q ≤ 2109; Q - P ≤ 105).
Yêu cầu: Hãy tìm tất cả các số nguyên dương X nằm thỏa mãn P ≤ X ≤ Q và số đảo
ngược của số X là số nguyên tố.

Dữ liệu vào: Cho trong file văn bản TIMSO.INP có cấu trúc như sau:
- Dòng 1: Ghi hai số nguyên dương P Q, hai số được ghi cách nhau ít nhất một dấu
cách.
Dữ liệu ra: Ghi ra file văn bản TIMSO.OUT trên nhiều dịng, mỗi dịng ghi một số
ngun X tìm dược.
Ví dụ:
TIMSO.INP

TIMSO.OUT

10 19

11
13
14
16
17

Chương trình:
#include <bits/stdc++.h>
using namespace std;
int daonguocso(int a)
{
int s = 0;
int n = a;
while (n > 0)
{
s = s * 10 + n % 10;
n = n / 10;
}

return s;
}
bool songto(int a)
{
if (a < 2)
return false;
for (int i = 2; i * i <= a; i++)
11


if (a % i == 0)
return false;
return true;
}
int main()
{
freopen("TIMSO.INP", "r", stdin);
freopen("TIMSO.OUT", "w", stdout);
int P, Q;
cin >> P >> Q;
while (P <= Q)
{
if (songto(daonguocso(P)) == true)
cout << P << endl;
P++;
}
return 0;
}
Kết quả chạy chương trình:


2.1.4 BÀI TẬP VỀ GIAI THỪA
Bài 1. Giai thừa của một số được cho bởi công thức sau: n!=1*2*…*n
Cho số N (N<=2.109) nguyên dương, hãy tính tổng giai thừa các chữ số của nó.
Hướng dẫn: Viết 1 hàm tính giai thừa của số nguyên dương N. Sử dụng hàm này để
tính tổng giai thừa các chữ số của một số.
Ví dụ:
Dữ liệu vào

Kết quả

123

9

Giải thích: Nhập vào N =123 -> Kết quả: 1!+2!+3! = 9
Chương trình:
#include<bits/stdc++.h>
using namespace std;
int giaithua(int n)
{
12


long long gt=1;
for(long i=2;i<=n;i++)
gt=gt*i;
return gt;
}
int main()
{

freopen("GT.INP","r",stdin);
freopen("GT.OUT","w",stdout);
long n; cin>>n; long long s=0;
if(n==0) s=1;
while(n>0)
{
long a=n%10;
s=s+giaithua(a);
n=n/10;
}
cout<return 0;
}
Kết quả chương trình:

2.1.5 BÀI TẬP VỀ SỐ HỒN HẢO
Số hồn hảo được hiểu đơn giản là số có tổng các ước số thật sự của nó bằng chính
nó. Ước số thật sự là ước số khơng bao gồm chính nó.
Ví dụ:


Số 6 là một số hồn hảo vì tổng các ước số thật sự của số 6 là: 1 + 2 + 3 =
6 (tức là bằng chính nó)



Số 12 khơng phải là một số hồn hảo vì tổng các ước số thực sự của số 12
là: 1 + 2 + 3 + 4 + 6 = 16 (khác với chính nó)

Giải thích thuật tốn: giả sử ta có một số a là số cần kiểm tra.

1. Đầu tiên ta tìm ra các ước số của a, -> ta sẽ cần một vòng lặp For, lặp từ 1 đến
a/2 với bước nhảy là 1 (i++).
2. Tiếp đến tạo một biến Sum, được dùng để tính tổng các ước số của a. Ta tạo
một điều kiện trong vịng lặp For, nếu (a % i == 0) thì sum += i.
13


3. Cuối cùng, kiểm tra nếu sum == a thì a chính là số hồn hảo và ngược lại.
* Lưu ý: Các ước số của a luôn bé hơn hoặc bằng a/2.
Bài 1. Nhập vào số nguyên n, kiểm tra số vừa nhập có phải là số hồn hảo khơng?
Ví dụ:
Dữ liệu vào Kết quả

Dữ liệu vào Kết quả

6

12

6 La so Hoan Hao

12 Khong la so Hoan Hao

Chương trình:
#include<iostream>
using namespace std;
bool check(int a){
int sum = 0;
for(int i=1;i<=a/2;i++)
{

if(a%i==0)
sum+=i;
}
if(sum==a) return true;
return false;
}
int main(){
int n;
cout<<"Nhap n: ";
cin>>n;
if(check(n) )
cout<else
cout<return 0;
}
Kết quả chạy chương trình:

Bài 2:

Cặp đôi hoàn hảo

Cho dãy số nguyên gồm n phần tử a1, a2,… an. Hai số ai và aj (i=1, 2,…n; j=1, 2,…n;
i≠j) được gọi là cặp đơi hồn hảo nếu ai, aj là 2 số nguyên tố. Với dãy số trên tìm số
cặp đơi hồn hảo.
14


u cầu: Hãy cho biết có bao nhiêu cặp đơi hồn hảo.
Ví dụ: Dãy số a là 3 2 -4 7 thì số cặp đơi hồn hảo là 3

Dữ liệu vào có nội dung như sau:
 Dịng đầu là số nguyên dương n (n≤103)
 Trong n dòng sau, dòng thứ i là số nguyên ai (i=1, 2,… n; |ai|≤105)
Kết quả ghi ra:
Một số nguyên duy nhất là số cặp đôi hồn hảo.
Ví dụ:
Dữ liệu vào

Kết quả ra

4

3

3
2
-4
7
Chương trình:
#include<bits/stdc++.h>
using namespace std;
int a[1000];
bool ktra(int a)
{
if(a<2) return false;
for(int i=2;i*i<=a;i++) if(a%i==0) return false;
return true;
}
int main()
{

int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int dem=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(ktra(a[i])==true&&ktra(a[j])==true) dem++;
cout<return 0;
}

15


2.1.6 BÀI TẬP VỀ SỐ CHÍNH PHƯƠNG
Số chính phương là số tự nhiên có căn bậc hai là một số tự nhiên, hay nói cách khác,
số chính phương bằng bình phương của một số tự nhiên.
Ví dụ:


Số 4 là số chính phương vì 2^2 = 4. (hoặc sqrt(4) = 2).



Tập các số chính phương như sau: CP = {4; 9; 16; 25; ...}.

Có các cách để viết thuật tốn kiểm tra số chính phương như sau:
1. Kiểm tra số chính phương bằng vịng lặp.
2. Kiểm tra số chính phương bằng hàm sqrt() trong thư viện math.h.
….

* Thuật toán kiểm tra số chính phương bằng vịng lặp.
Thuật tốn:


Lặp i chạy từ 0 đến khi i*i > n. Nếu i * i = n thì n chính là số chính phương,
kết thúc chương trình.



Nếu i * i > n thì n khơng phải là số chính phương.

* Thuật tốn kiểm tra số chính phương bằng hàm sqrt()
Thuật tốn:


Trong thư viện math.h có một hàm được dùng để tính căn bậc hai, đó chính là
hàm sqrt()



Chúng ta sử dụng hàm sqrt() để đặt điều kiện cho số n. Nếu sqrt(n) * sqrt(n)
= n, thì n chính là số chính phương và ngược lại.

Bài 1: Viết chương trình nhập vào một dãy gồm n số nguyên. Hãy tìm và in ra màn
hình các số chính phương có trong dãy đó.
Ví dụ:
Dữ liệu vào

Kết quả


Nhap n = 6

Cac so chinh phuong:

2 4 5 8 9 14

49

Chương trình:
#include <iostream>
#include <math.h>
using namespace std;
bool scp(int n)
{
16


int sqr = sqrt(n);
if(sqr*sqr == n)
{
return true;
}
else return false;
}
int main()
{
int n;
do{
cout << "\nNhap n = ";
cin >> n;

}while(n <= 0);
int a[n];
for(int i = 0;i < n;i++) cin >> a[i];
cout << "\nCac so chinh phuong:\n";
for(int i = 0;i < n; i++)
{
if(scp(a[i]))
{
cout << a[i] << "
";
}
}
}
Kết quả chạy chương trình:

2.1.7 BÀI TẬP VỀ SỐ PHONG PHÚ
Bài 1: Đếm số phong phú.
Số phong phú là số có tổng các ước số nguyên của nó kể cả số 1 (khơng kể
chính nó) lớn hơn nó. Ví dụ: Số 6 có tổng các ước 1+ 2+ 3 = 6 không là số phong
phú. Số 12 có tổng các ước là 1+ 2+ 3+ 4+ 6 = 16 (Lớn hơn 12) là số phong phú.
Yêu cầu: Hãy cho biết có bao nhiêu số phong phú khơng lớn hơn N.
Dữ liệu vào: Số nguyên N (0< N ≤ 105)

17


Kết quả: Ghi một số nguyên duy nhất là kết quả tìm được theo u cầu.
Ví dụ:
Dữ liệu vào


Kết quả ra

Nhap n: 24

4

Giải thích: Trong ví dụ trên có 4 số phong phú là 12, 18, 20, 24
Chương trình:
#include<bits/stdc++.h>
using namespace std;
int tonguoc(int n)
{
int s=1;
for(int i=2;i<=n/2;i++)
if(n%i==0) s+=i;
return s;
}
bool ktra(int n)
{
if(tonguoc(n)>n) return true; return false;
}
int main()
{
int n;
cout<<"Nhap n:";
cin>>n;
if(n<12)
{
cout<<"0";
return 0;

}
int x=13;
int dem=1;
while(x<=n)
{
if(ktra(x)==true) dem++;
x++;
}
cout<return 0;
}

18


Kết quả chạy chương trình:

2.1.8 BÀI TẬP VỀ SỐ ĐẸP
Bài 1
Một số nguyên dương được gọi là số đẹp khi tổng bình phương các chữ số của nó là
một số ngun tố.
Ví dụ: số 12 là một số đẹp vì 12 + 22 = 5 là số nguyên tố.
Yêu cầu: Cho số nguyên dương N, có bao nhiêu số đẹp nhỏ hơn hoặc bằng N.
Dữ liệu nhập vào gồm một số nguyên dương N (1 ≤ N ≤ 106)
Kết quả ra là số lượng số đẹp nhỏ hơn hoặc bằng N.
Ví dụ:
Dữ liệu vào

Kết quả ra


20

4

Hướng dẫn: Cần viết 2 hàm: Kiểm tra Số đẹp; Kiểm tra nguyên tố.
Chương trình:
#include<bits/stdc++.h>
using namespace std;
int sodep(int n)
{
int s=0;
while(n>0)
{
int a=n%10;
s+=a*a;
n=n/10;
}
return s;
}
bool ktra(int n)
{
if(n<2) return false;
for(int i=2;i*i<=n;i++)
if(n%i==0) return false; return true;
}
int main()
19


{

int n;
cin>>n;
int x=1; int dem=0;
while(x<=n)
{
if(ktra(sodep(x))==true) dem++;
x++;
}
cout<return 0;
}
Kết quả chạy chương trình:

2.1.9 BÀI TẬP VỀ SỐ THÂN THIỆN
Bài 1.
Đang tìm hiểu các thuật toán về số tự nhiên, Nguyên phát hiện ra số tự nhiên
có rất nhiều tính chất thú vị. Nhiều số tự nhiên khi tìm ước chung lớn nhất với số
đảo ngược của nó bằng 1, những số như thế được gọi là số thân thiện. Chẳng hạn
số 23, số đảo ngược của nó là 32, hai số này có ước chung lớn nhất là 1 nên số 23
là số thân thiện và 32 cũng là số thân thiện.
Yêu cầu: Cho 2 số tự nhiên a, b (10 ≤ a ≤ b ≤ 104). Hãy đếm xem trong đoạn
từ a đến b có bao nhiêu số thân thiện.
Ví dụ:
Dữ liệu vào

Kết quả

Giải thích

19 29


4

Đó là các số: 19, 23, 25, 29

- Ý tưởng: Dùng 1 biến Dem để lưu số lượng số thân thiện
Xét lần lượt các số tự nhiên i từ a tới b
Với mỗi số i xác định số tự nhiên j là đảo ngược của i
Nếu UCLN(i,j)= 1 thì tăng biến Dem lên 1
Kết quả bài tốn là Dem
Chương trình:

20


#include<bits/stdc++.h>
using namespace std;
int daonguocso(int n)
{
int s=0;
while(n>0)
{
s=s*10+n%10;
n=n/10;
}
return s;
}
bool ucln(int n,int m)
{
while(n!=m)

{
if(n>m) n=n-m; else m=m-n;
}
if(m==1) return true; else return false;
}
int main()
{
freopen("rb.inp","r",stdin);
freopen("rb.out","w",stdout);
int a,b; int dem=0;
cin>>a>>b;
while(a<=b)
{
if(ucln(a,daonguocso(a))==true) dem++;
a++;
}
cout<return 0;
}
Kết quả chạy chương trình:

21


2.2 BÀI TẬP XÂU
2.2.1 Các kiến thức cơ bản về xâu
Xâu là dãy các kí tự trong bảng mã ASCII, mỗi kí tự được gọi là một phần tử của
xâu. Số lượng kí tự trong một xâu được gọi là độ dài của xâu. Xâu có độ dài bằng 0
gọi là xâu rỗng.
a, Khai báo

Khi khai báo biến xâu cần sử dụng thư viện string
Biến kiểu xâu có thể khai báo như sau:
string <tên biến xâu>[độ đài lớn nhất]
Ví dụ
string hoten[50];
Trong mơ tả xâu có thể bỏ qua phần khai báo độ dài, chẳng hạn:
string diachi;
Khi đó độ dài lớn nhất của xâu sẽ nhận giá trị ngầm định là 255.
Lưu ý: Chỉ số xâu bắt đầu từ 0
b, Các thao tác xử lí xâu
* Phép ghép xâu, kí hiệu là dấu cộng (+), được sử dụng để ghép nhiều xâu thành
một. Có thể thực hiện phép ghép xâu đối với các hằng và biến xâu.
Chúng ta vẫn sử dụng thủ tục cin để ghép xâu được, điểm khác nhau giữa cin và
getline được thể hiện trong ví dụ sau:
Giả sử bạn muốn nhập xâu “Truong THPT PDL” cho xâu s.
cin>>s;
chỉ nhận được xâu “Truong”
getline(cin,s);
nhận toàn bộ xâu “Truong THPT PDL”
* Các phép so sánh bằng (= =), khác (<>), nhỏ hơn (<), lớn hơn (>), nhỏ hơn hoặc
bằng (<=), lớn hơn hoặc bằng (>=)
* Để xử lí các xâu có thể sử dụng các thủ tục và hàm chuẩn dưới đây:
- Hàm <tên biến xâu>.erase(<vị trí bắt đầu>, <số ký tự xóa>): Xóa <số ký tự xóa>
của chuỗi <tên biến xâu> kể từ <vị trí bắt đầu>; nếu khơng quy định giá trị tự xóa> thì tất cả các ký tự của <tên biến xâu> từ <vị trí bắt đầu> trở đi sẽ bị xóa
- Hàm <tên biến xâu>.insert(<vị trí bắt đầu>, <xâu chèn>): Chèn <xâu chèn> vào
xâu <tên biến xâu> bắt đầu ở vị trí <vị trí bắt đầu>.
- Hàm <tên biến xâu>.substr(<vị trí bắt đầu>, n): Tạo xâu gồm n kí tự liên tiếp bắt
đầu từ vị trí <vị trí bắt đầu> của xâu <tên biến xâu>.
- Hàm length(s) cho giá trị là độ dài xâu s.


22


×