Chủ Nhật, 22 tháng 12, 2013

Số cấp nhân



Số cấp nhân



           Tìm các số tự nhiên có ba chữ số. Ba chữ số này, theo trật tự từ trái qua phải tạo thành một cấp số nhân với công bội là một số tự  nhiên khác 0.

Đặc tả
Chú ý rằng ta chỉ xét các cấp số trên dãy số tự nhiên với công bội d là một số nguyên dương. Gọi x là số cần tìm, ta có:
           1.  x là số có ba chữ số: x = 100*a + 10*b + c.
           2.  a = 1..9; b = a*d; 0 < c = a*d*d £ 9.
           Hệ thức 2 cho phép ta tính giới hạn trên của d:
d là số nguyên nên ta phải có d £ trunc(sqrt(9 div a)), trong đó sqrt là hàm tính căn bậc hai, trunc là hàm lấy phần nguyên.
Ta cho a biến thiên trong khoảng 1..9 rồi cho công bội d biến thiên trong khoảng từ 1 đến trunc(sqrt(9 div a)). Với mỗi cặp số a và d ta tính
x = 100*a+10*a*d+a*d*d = a*(100+10*d+d*d)
Tuy nhiên, ta có thể nhẩm tính trước cận trên của d thì sẽ đỡ phải gọi các hàm trunc và sqrt là những hàm thao tác trên số thực do đó sẽ tốn thời gian.

a
1
2
3
4
5
6
7
8
9
Cận trên d
3
2
1
1
1
1
1
1
1
(*  Pascal  *)
(*----------------------------
   Cac so tu nhien 3 chu so
   lap thanh cap nhan
------------------------------*)
program CapNhan;
uses crt;
const MN = 30;
      cd: array[1..9] = (3,2,1,1,1,1,1,1,1);
var s: array [1..MN] of integer;
      n: integer;
function Tim: integer;
var a,d,n: integer;
begin
  n:= 0;
  for a:= 1 to 9 do
    for d:=1 to cd[a]do
    begin
     inc(n); s[n]:= a*(100+10*d+d*d);
    end;
  Tim:= n;
end;
procedure Xem(n: integer): tự viết
BEGIN
  clrscr; n:= Tim; Xem(n);
  writeln; write('Tong cong ',n,' so'); readln;
END.

Không có nhận xét nào:

Đăng nhận xét