Dãy ước số chung lớn nhất – Code C++ và Pascal

Like Tweet Pin it Share Share Email

An mới bắt đầu học toán và cậu ta vẫn chưa biết gì về ước số chung lớn nhất. Cho nên cậu ta cần sự giúp đỡ của bạn để làm một vài phép toán. An có một dãy A gồm N số nguyên, được đánh số từ 1 đến N và An muốn tạo một mảng B gồm N+1 phần tử được đánh số từ 1 đến N+1 và các phần tử của mảng B có tính chất sau: UCLN(B[i], B[i + 1]) = A[i], ∀ 1 ≤ i ≤ N.

Nếu như có nhiều kết quả thì bạn chỉ cần cho An biết mảng B có tổng các phần tử là nhỏ nhất (vì cậu ta chỉ mới bắt đầu học toán nên rất ngại các con số lớn).

Dữ liệu vào:

  • Dòng đầu tiên chứa một số nguyên T– số lượng test case (1 ≤  T ≤ 10). Tiếp theo là các test case:
  • Dòng đầu tiên của mỗi test case chứa một số nguyên dương N– số lượng phần tử của mảng A (2 ≤ N ≤ 105).
  • Dòng thứ hai chứa N số nguyên A1A2 … AN (1  ≤ Ai  ≤ 109)

Dữ liệu ra:

  • Với mỗi test case xuất trên một dòng chứa N+1 phần tử của mảng B (0 < Bi)

Ví dụ:

dayucnl.inp dayucnl.out
2

3

1 2 4

3

6 10 2

1 2 4 4

6 30 10 2

Code trong C++

 

Code trong Pascal

var n,t,i,j,B:longint;
    A:array [1..1000000] of longint;
    f1,f2:text;
function ucln(m,n:longint):longint;
var du:longint;
begin
du:=0;
while n<>0 do
  begin
  du:=m mod n;
  m:=n;
  n:=du;
  end;
ucln:=m;
end;
procedure motep;
begin
assign(f1,'dayucln.inp');
reset(f1);
assign(f2,'dayucln.out');
rewrite(f2);
end;
procedure dongtep;
begin
close(f1);
close(f2);
end;
begin
motep;
readln(f1,t);
for i:=1 to t do
   begin
   readln(f1,n);
   for j:=1 to n-1 do read(f1,A[j]);
   readln(f1,A[n]);
   write(f2,A[1],' ');
   for j:=1 to n-1 do
      begin
      B:=(A[j]*A[j+1]) div ucln(A[j],A[j+1]);
      write(f2,B,' ');
      end;
   writeln(f2,A[n]);
   end;
dongtep;
end.

Comments (0)

Trả lời

Your email address will not be published. Required fields are marked *