Bài 2.13 Lũy thừa 2, 3 và

Một phần của tài liệu Các hàm Next (Trang 36 - 37)

Dijkstra E. Với mỗi giá trị N cho trước hãy sinh N số đầu tiên theo trật tự tăng dần là tích các lũy thừa của 2, 3 và 5.

Dữ liệu vào: tệp văn bản LUYTHUA.INP

Chứa số tự nhiên N, 1 N 1000. Dữ liệu ra: tệp văn bản LUYTHUA.OUT N số tìm được, mỗi dòng một số.

Thuật toán

Gọi S là tập các số cần tìm. Ta có (i) 1  S

(ii) Nếu x  S thì 2x, 3x, 5x  S.

Giả sử các phần tử trong S được sắp tăng và ta đã tìm được phần tử thứ i. Ta kí hiệu S(i) = { a1, a2,…,ai }. Để tìm phần tử thứ i+1 ta nhận xét

ai+1 = Min { 2x, 3y, 5z | x, y, z  S(i), 2x > ai, 3y > ai, 5z > ai }

Ta sử dụng 3 biến i2, i3, i5 để ghi nhận các chỉ số trong S sao cho ai2 = x, ai3 = y và ai5 = z. Các biến a[1], i2, i3 và i5 được khởi trị 1.

Khi đó hàm Next(i) sinh phần tử sát sau phần tử A[i] sẽ như sau:

function Next(i: integer): integer; begin

while (a[i2] * 2 <= a[i]) do i2 := i2 + 1; while (a[i3] * 3 <= a[i]) do i3 := i3 + 1; while (a[i5] * 5 <= a[i]) do i5 := i5 + 1; Next := Min(a[i2]*2, a[i3]*3, a[i5]*5); end;

(* Pascal *)

(*************************************** LUY THUA cua 2, 3, 5 LUY THUA cua 2, 3, 5

*************************************) program LuyThua; program LuyThua;

uses crt;

const bl = #32; mn = 1001; fn = 'LUYTHUA.INP'; gn = 'LUYTHUA.OUT'; type ml1 = array[0..mn] of longint;

var f,g: text; n: integer; a: ml1;

procedure Doc: tự viết;

function Min(a,b,c: longint): tự viết; function Next(i: integer): tự viết; procedure Sinh; var i: longint; begin assign(g,gn); rewrite(g); LUYTHUA.INP LUYTHUA.OUT 12 1 2 3 4 5 6 8 9 10 12 15 16

a[1] := 1; writeln(g,1); i2 := 1; i3 := 1; i5 := 1; for i := 2 to n do begin a[i] := Next(i-1); writeln(g,a[i]); end; close(g); end; BEGIN Doc; Sinh; END. // C# using System; using System.IO; namespace SangTao2 { /*---* Luy thua 2, 3, 5 * ---*/ class LuyThua235 {

const string fn = "LuyThua.inp"; const string gn = "LuyThua.out";

static public int n; // so luong phan tu static public int[] a;

static void Main(){

Doc(); Sinh(); Ghi(); XemKetQua(); Console.WriteLine("\n fini");

Console.ReadLine(); } // Main

static public void Doc()

{ n = int.Parse(File.ReadAllText(fn).Trim()); } static public void Sinh(){

a = new int[n];

int i2 = 0, i3 = 0, i5 = 0; a[0] = 1; int n1 = n-1;

for (int i = 0; i < n1; ++i){ // Next while (a[i2] * 2 <= a[i]) ++i2; while (a[i3] * 3 <= a[i]) ++i3; while (a[i5] * 5 <= a[i]) ++i5;

a[i + 1] = Min(a[i2] * 2, a[i3] * 3, a[i5] * 5); }

}

static public int Min(int x, int y, int z) : tự viết static public void Ghi(){

StreamWriter g = new StreamWriter(gn);

for (int i = 0; i < n; ++i) g.WriteLine(a[i]); g.Close();

}

static void XemKetQua(): tự viết } // LuyThua235

Một phần của tài liệu Các hàm Next (Trang 36 - 37)