Số hoàn hảo Số hoàn thiện (hay còn gọi là số hoàn chỉnh, số hoàn hảo hoặc số hoàn thành) là một số nguyên dương mà tổng các ước nguyên dương của nó (số nguyên dương chia hết cho nó) bằng chính nó Ví dụ Số 6 có ước nhỏ hơn nó là 1,2,3 Tổng là 1+2+3=6 vậy 6 là số hh Số 8 chia hết cho 1, 2, 4 tổng 1+2+4=7 → 8 không phải là số hh Số 28 chia hết cho 1, 2,4, 7, 14 tổng 1+2+4+7+14=28 → 28 là số hh 1 Nhập vào số nguyên n, kiểm tra n có phải là số hoàn hảo không? Nhận xét số hoàn hảo là số có tổng các ướ.
Trang 1Số hoàn hảo.
Số hoàn thiện (hay còn gọi là số hoàn chỉnh, số hoàn hảo hoặc số hoàn thành) là một số nguyên dương mà tổng các ước nguyên dương của nó (số nguyên dương chia hết cho nó) bằng chính nó
Ví dụ:
Số 6 có ước nhỏ hơn nó là 1,2,3 Tổng là 1+2+3=6 vậy 6 là số hh
Số 8 chia hết cho 1, 2, 4 tổng 1+2+4=7 → 8 không phải là số hh
Số 28 chia hết cho 1, 2,4, 7, 14 tổng 1+2+4+7+14=28 → 28 là số hh
hảo không?
Nhận xét: số hoàn hảo là số có tổng các ước thực sự bằng chính
nó
- Để kiểm tra n có phải là số hoàn hảo không? Ta sẽ tìm ước thực sự của n rồi cộng các ước thực sự lại, nếu tổng các ước thực sự bằng n thì
n là số hoàn hảo
Program
sohoanhao; Var
i,n,tong:longint;
Begin
Readln (n);
Tong:=
0;
For i:=1 to n-1 do
If n mod i = 0 then tong:=tong+i;
If tong=n then write (n, ‘la so hoan hao’);
Readln;
Trang 2Viết chương trình nhập vào một số n từ bàn phím thông báo ra màn hình số đó có phải là số hoàn hảo hay không (yêu cầu dùng hàm).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PROGRAM SoHoanHao;
USES CRT;
VAR n:INTEGER;
FUNCTION KiemTra(x:INTEGER):BOOLEAN;
VAR tam,i:INTEGER;
BEGIN
tam:=0;
FOR i:= 1 TO (x DIV 2) DO
IF x MOD i = 0 THEN tam:=tam+i;
IF tam = x THEN KiemTra:=TRUE
Else KiemTra:=False;
END;
BEGIN
Clrscr;
Write('Nhap so can kiem tra ');Readln(n);
IF KiemTra(n) THEN
Writeln('So ',n,' la so hoan hao')
ELSE
Writeln('So ',n,' khong phai la so hoan hao');
Readln;
END
Yêu cầu: Cho dãy số a1, a2, an Hãy giúp Bờm đếm xem trong dãy có bao nhiêu
số có tổng các chữ số là số hoàn hảo
Dữ liệu vào: Từ file BAI2.INP gồm:
- Dòng đầu tiên là số nguyên dương n (n ≤ 100)
- n dòng tiếp theo ghi n số nguyên a1, a2, an (0 ≤ ai ≤109)
Trang 3Kết quả: Ghi ra file BAI2.OUT gồm: Một dòng duy nhất là kết quả của bài toán program sohoanhao;
uses crt;
var N,i,dem:longint;
a:array[1 100] of longint;
f1,f2:text;
function sohoanhao(n:longint):boolean;
var S,i:longint;
shh:boolean;
Begin
S:=0;shh:=true;
for i:=1 to n-1 do if n mod i = 0 then S:=S+i;
if n<>S then shh:=false;
sohoanhao:=shh;
End;
{ -}
BEGIN
assign(f1,'sohoanhao.inp');reset(f1);
assign(f2,'sohoanhao.out');rewrite(f2);
readln(f1,N); dem:=0;
for i:=1 to N do
Begin
readln(f1,a[i]);
if sohoanhao(a[i]) then inc(dem);
End;
write(f2,dem);
close(f1);close(f2);
Trang 4Bài 2 Số chính phương
Cho số nguyên n, kiểm tra n có phải là số chính phương không?
Ý tưởng: Dựa trên định nghĩa số chính phương: là bình phương của một số tự nhiên
Ta có:
Nhận xét: Số chính phương là số có phần thập phân của căn bậc 2 là 0
Như vậy, để viết chương trình ta sử dụng hàm sqrt() để lấy căn bậc 2, hàm frac ()
để lấy phần thập phân
Chương trình tham khảo:
Program CP; Var n:longint;
Begin
Write (‘nhap n:’); Readln (n);
If (frac(sqrt(n))=0) and (n>=0) then write (n, ‘la so CP’) else write (n, ‘ko la so CP’);
Readldn
End
In ra số chính phương nhỏ hơn 100.
Ý tưởng:
Để kiểm tra lần lượt các số chính phương nhỏ hơn 100 thì ta sẽ kiểm tra lần lượt các số từ 0 đến 99 có phải là số chính phương không, bằng câu lệnh for
… to … do
Chương trình tham khảo:
Program CP; Var i:longint; Begin
For i:=0 to 99 do
If frac(sqrt(i))=0 then write (i,’ ‘); Readldn
0
Trang 5Tính tổng các số chính phương trong dãy số tự nhiên liên tiếp 1, 2, 3, , N (N
<= 30000).
Dữ liệu vào: Từ file văn bản bai1.inp: chứa một số tự nhiên n
Kết quả: Ghi ra file văn bản bai1.out: Chứa một số là tổng của các số chính
phương
Ví dụ:
bai1.inp bai1.out
10 14
chương trình:
uses crt;
var n,i,s:longint;
f1,f2:text;
FUNCTION chinhphuong(n:longint):boolean;
var cp:boolean;
i:longint;
Begin
cp:=false;
for i:=1 to n do if (n div i = i) and (n mod i = 0) then cp:=true;
chinhphuong:=cp;
End;
{ -}
Begin
assign(f1,'chinhphuong.inp');reset(f1);
assign(f2,'chinhphuong.out');rewrite(f2);
s:=0;
Trang 6for i:=1 to n do if chinhphuong(i) then s:=s+i; write(f2,s);
close(f1);close(f2);
END
uses crt;
type ArrInt = array[1 250] of integer;
Var n,i,x : integer;
a: ArrInt;
BEGIN
clrscr;
write('Nhap so phan tu: ');
readln(n);
for i:=1 to n do
begin
write('Phan tu thu ',i,'= ');
readln(a[i]);
end;
writeln('Cac so chinh phuong co trong mang:'); for i:=1 to n do
begin
x:=trunc(sqrt(a[i]));
if sqr(x)=a[i] then
write(a[i]:4);
end;
Trang 7readln; END.
Dãy Fibonacci là dãyvô hạn các số tự nhiên bắt đầu bằng hai phần tử 0 và 1 hoặc
1 và 1, các phần tử sau đó được thiết lập theo quy tắc mỗi phần tử luôn bằng tổng hai phần tử trước nó
Hướng dẫn lập trình Pascal: Viết chương trình tính các số Fibonacci
Tính các số Fibonacci:
- F1=F2 = 1
- Fn = Fn-1 + Fn-2
Program FIBONACII;
Uses Crt;
Var n,kq:integer;
Function F(n:integer):integer;
Begin
If (n=1) or (n=2) then
F:=1
Else
F:=F(n-1)+F(n-2);
End;
Begin
Clrscr;
Writeln(' TINH SO FIBONACII:');
Writeln(' -');
Write('Nhap n = '); Readln(n);
Write('F(',n,')= ',f(n));
Readln;
End
BT: Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử Chèn số k vào vị trí đầu dãy.
Ý tưởng:
Lấy ví dụ:
2 3 4 5 6 7 => 9 2 3 4 5 6 7
Đưa các phần tử trong mảng a lui về sau 1 đơn vị, sau đó chèn số k vào vị trí đầu tiên của dãy
Trang 8In kết quả.
Chương trình tham khảo:
Var a:array[1 50] of longint; I,n,k: longint;
Begin
Read (n);read (k);
For i:=1 to n do read (a[i]); For i:=n+1 downto 2 do
A[i]:=a[i-1]; A[1]:=k;
For i:=1 to n+1 do Write (a[i], ‘ ‘); Readln;
Readln; End
BT: Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử Chèn số k vào vị trí cuối cùng của dãy.
Lấy ví dụ:
2 3 4 5 6 7 => 2 3 4 5 6 7 9
Giữ nguyên các phần tử của dãy, sau đó chèn số k vào vị trí cuối cùng của dãy In kết quả
Chương trình tham khảo:
Var a:array[1 50] of longint; I,n: longint;
Begin
Read (n); read (k);
For i:=1 to n do read (a[i]);
For i:=1 to n+1 do a[n+1]:=k; For i:=1 to n+1 do write (a[i], ‘ ‘);
Readln; Readln; End
BT: Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử kiểm tra số
k, nếu số k là số chính phương thì chèn số k vào vị trí đầu dãy, ngược lại thì chèn vào cuối dãy.
Trang 9Ý tưởng:
Lấy ví dụ:
3 3 4 5 6 7 => 9 2 3 4 5 6 7
4 6 3 7 8 1 => 4 6 3 7 8 1 5
BT: Kiểm tra số k có phải là số chính phương không,
nếu số k là số chính phương thì chèn số k vào vị trí đầu dãy, ngược lại thì chèn vào cuối dãy In kết quả.
Chương trình tham khảo:
Var a:array[1 50] of longint; I,n,k: longint;
Begin
Read (n);read (k);
For i:=1 to n do read (a[i]); If frac(sqrt(k)) = 0 then
begin
For i:=n+1 downto 2 do
A[i]:=a[i-1];
A[1]:=k;
End;
If frac(sqrt(k)) <> 0 then begin
For i:=1 to n+1 do
A[n+1]:=k;
End;
For i:=1 to n+1 do Write (a[i], ‘ ‘); Readln;
Readln; End
Trang 10BT: Viết chương trình nhập vào 1 dãy số nguyên a gồm n phần tử Sắp xếp mảng theo thứ tự chẵn 1 hàng, lẻ 1 hàng.
Ý tưởng:
Lấy ví dụ:
2 3 4 5 6 7 => 2 4 6
3 5 7
1 1 1 1 1 1 => 1 1 1 1 1 1
2 2 2 2 2 2 => 2 2 2 2 2 2
3 3 3 3 4 5 => 3 3 3 3 5
4
Nhập vào các phần tử của mảng
Kiểm tra lần lượt các phần tử của mảng nếu là phần tử chẵn thì in ra Sau đó xuống dòng, trở về vị trí ban đầu, kiểm tra lần lượt các phần tử của mảng, nếu phần
tử là số lẻ thì in ra
Chương trình tham khảo:
Var a:array [1 50] of longint; I,n:longint;
Begin Read (n);
For i:=1 to n do Read (a[i]);
For i:=1 to n do
If a[i] mod 2 = 0 then write (a[i],’ ‘); writeln;
For i:=1 to n do
If i mod 2 <> then write (a[i],’ ‘); Readln
End