Chương 5 Luyện tập từ các đề thi
5.1 Số nguyên tố cùng độ cao Olimpic Duy Tân 2009 Độ cao của một số tự nhiên là tổng các chữ số của số đó. Với mỗi cặp số tự nhiên n và h cho trước hãy liệt kê các số nguyên tố không vượt quá n và có độ cao h, 10 n 1000000; 1 h 54.
hprimes.inp
|
hprimes.out
|
n h
|
mỗi dòng 1 số
|
Dữ liệu test
n = 1000, h = 16. Kết quả 15 số nguyên tố độ cao 16: 79, 97, 277, 349, 367, 439, 457, 547, 619, 673, 691, 709, 727, 853, 907.
Thuật toán
Thuật toán liệt kê các số nguyên tố độ cao h trong khoảng 1..n
|
1. Gọi thủ tục Sang(n) (do Eratosthenes đề xuất, xem Tập 2)
xác định các số nguyên tố trong khoảng 1..n
và đánh dấu vào mảng byte p: p[i] = 0 khi và chỉ khi i là số nguyên tố.
2. Duyệt lại các số nguyên tố i trong danh sách p, tính độ cao của số i.
Nếu Height(i) = h thì ghi nhận.
3. end.
|
Để tính độ cao của số i ta tách dần các chữ số hàng đơn của i bằng phép chia dư cho 10 rồi cộng dồn vào một biến tổng.
Độ phức tạp
Thủ tục sàng duyệt lần, mỗi lần lại duyệt n phần tử do đó cần cỡ n thao tác cơ sở (phép nhân, phép gán).
Chương trình
(* Hprimes.pas – So nguyen to cung do cao *)
uses crt;
const fn = 'hprimes.inp'; gn = 'hprimes.out';
nl = #13#10; bl = #32; mn = 1000000;
type mb1 = array[0..mn] of byte;
var p: mb1;
n,h: longint;
procedure Sang(n: longint);
var i,j: longint;
begin
fillchar(p,sizeof(p),0);
for i := 2 to round(sqrt(n)) do
if (p[i] = 0) then
for j := i to (n div i) do p[i*j] := 1;
end;
function Height(x: longint): integer;
var sum : integer;
begin
sum := 0;
while x <> 0 do
begin
sum := sum + (x mod 10);
x := x div 10;
end;
Height := sum;
end;
procedure Ghi;
var i: longint;
G: text;
begin
assign(g,gn); rewrite(g);
for i := 2 to n do
if p[i] = 0 then
if Height(i) = h then writeln(g,i);
close(g);
end;
procedure Doc;
var f: text;
begin
assign(f,fn); reset(f);
readln(f,n,h); close(f);
end;
BEGIN
Doc; Sang(n); Ghi;
writeln(nl,' Fini'); readln;
END.
// DevC++: hprimes.cpp - So nguyen to cung do cao
#include
#include
#include
#include
#include
using namespace std;
// D A T A A N D V A R I A B L E
const int mn = 1000001;
char p[mn];
int n, h;
const char * fn = "hprimes.inp";
const char * gn = "hprimes.out";
// P R O T O T Y P E S
void Doc();
void Sang();
void Ghi();
int Height(int x);
// I M P L E M E N T A T I O N
int main() {
Doc(); Sang(); Ghi();
cout << endl << endl << " Fini" << endl;
return 0;
}
void Doc() {
ifstream f(fn);
f >> n >> h;
f.close();
}
// Sang Eratosthenes
void Sang() { // p[i] = 0 <=> i nguyen to
int can = (int) sqrt(n);
int i, j, ni;
memset(p,0,sizeof(p));
for (i = 2; i <= can ; ++i)
if (p[i] == 0)
for (ni = n/i, j = i; j <= ni; ++j)
p[i*j] = 1;
}
int Height(int x) { // tong so bit 1 cua x
int d = 0;
for (; x ; x /= 10) d += (x % 10);
return d;
}
void Ghi() {
int i;
ofstream g(gn);
for (i = 2; i <= n; ++i)
if (p[i] == 0)
if (Height(i) == h)
g << endl << i;
g.close();
}
5.2 Số nguyên tố cùng số bít 1 Olimpic Đại học Kỹ thuật Công nghệ Tp HCM 2009 Với mỗi n và h cho trước hãy cho biết có bao nhiêu số nguyên tố không vượt quá n và ở dạng nhị phân chứa đúng h bit 1, 10 n 1000000; 1 h 30.
bprimes.inp
|
bprimes.out
|
Giải thích
Có 7 số nguyên tố trong khoảng 1..100
chứa đúng h = 4 bit 1. Đó là 23 = 101112 ;
29 = 111012 ; 43 = 1010112 ; 53 = 1101012;
71 =10001112; 83 = 10100112 ; 89 =10110012.
|
100 4
|
7
|
Bài này là dạng đặc biệt của bài trước vì trong dạng nhị phân (chỉ chứa các chữ số 0/1) thì tổng các chữ số chính là số bit 1. Thủ tục Sum dưới đây tính tổng các chữ số của số tự nhiên x khi biểu diễn x theo dạng hệ số b bất kỳ, b > 1. Như vậy, để tính tổng các chữ số của x trong hệ đếm 10 ta gọi Height(x,10). Nếu cần tính tổng các bít 1 của x ta gọi Height(x,2).
(* Pascal *)
function Height(x: longint, b: integer): integer;
var sum : integer;
begin
sum := 0;
while x <> 0 do
begin
sum := sum + (x mod b);
x := x div b;
end;
Height := sum;
end;
// DevC++
int Height(int x, int b) {
int d = 0;
for (; x ; x /= b) d += (x % b);
return d;
}
Chương trình giải bài này giống như bài trước ngoại trừ thay đổi nhỏ là thay lời gọi hàm một tham số Height(x) bằng lời gọi 2 tham số Height(x,2).
Dữ liệu test
n = 100, h = 4: 7
n = 1000000, h = 11: 14176
n = 1000, h = 4: 29
Chia sẻ với bạn bè của bạn: |