Cho một số tự nhiên n (3<=n<=1000). Phân tích n thành các tổng sao cho mỗi tổng gồm đúng k số hạng. Các số hạng của tổng phải lớn hơn 0 và trong mỗi tổng không có 2 số hạng giống nhau. Hai tổng được gọi là khác nhau nếu chúng khác nhau ít nhất một số hạng.
Viết chương trình giải quyết bài toán trên theo các yêu cầu sau:
- Input: Giá trị N và K
- Output: Kết quả của bài toán, mỗi tổng ghi trên một dòng. Trong mỗi tổng, các số hạng cách nhau ít nhất một ký tự trắng.
Chương trình ví dụ:
Mã: Chọn tất cả
Input:
8 3
Output:
1 2 5
13 4
Mã: Chọn tất cả
Var mTest : Array[1..100] Of Integer;
N, K : Integer;
Procedure Print;
Var i : Integer;
Begin
For i := 1 To K Do Write(mTest[i], ' ');
WriteLn;
End;
Procedure Process;
Var i, j, T : Integer;
Flag : Boolean;
Begin
T := 0;
For i := 1 To K Do T := T + mTest[i];
Flag := True;
If T = N Then Begin
For i := 1 To K-1 Do
For j := i+1 To K Do
If mTest[i] >= mTest[j] Then Flag := False
End Else Flag := False;
If Flag Then Print;
End;
Procedure Test(m : Integer);
Var i : Integer;
Begin
For i := 1 To N Do Begin
mTest[m] := i;
If m = K Then Process Else Test(m + 1);
End;
End;
Begin
ReadLn(N, K);
If Not ((3 <= N) And (N <= 1000) And (K > 0)) Then Begin
Write('Input khong hop le');
ReadLn;
Exit;
End;
Test(1);
ReadLn;
End.
Viết chương trình cho phép phân tích một số nguyên N ra thành thừa số nguyên tố và ghi kết quả dưới dạng tích của các lũy thừa.
Chương trình ví dụ:
Mã: Chọn tất cả
Input: 200
Output: 2^2*3*5^2
Mã: Chọn tất cả
Uses Crt;
Function SNT(N : Integer) : Boolean;
Var i : Integer;
Begin
If N <= 1 Then Exit(False);
For i := 2 To N - 1 Do
If N Mod i = 0 Then Exit(False);
Exit(True);
End;
Var i, N, S, k : Integer;
First : Boolean;
Begin
ClrScr;
ReadLn(S);
N := S;
First := True;
For i := 2 To S Div 2 Do
If SNT(i) And (N Mod i = 0) Then Begin
k := 0;
While N Mod i = 0 Do Begin
Inc(k);
N := N Div i;
End;
If Not First Then Write('*')
Else First := False;
If k > 1 Then Write(i, '^', k)
Else Write(i);
End;
ReadLn;
End.