Xin chào mọi người.
Mình có 1 bài tập như sau: Cho người dùng nhập vào 1 mảng số nguyên. Sau đó dịch trái hoặc phải xoay vòng k lần (với k là số do người dùng nhập vào, t là ký tự để phân biệt dịch trái hoặc phải). Xuất mảng sau khi dịch.
VD: Mảng ban đầu là 1 2 3 4 5
Dịch trái xoay vòng 1 lần => 2 3 4 5 1
Dịch trái xoay vòng 2 lần => 3 4 5 1 2
Dịch trái xoay vòng 3 lần => 4 5 1 2 3
Dịch trái xoay vòng 4 lần => 5 1 2 3 4
Dịch trái xoay vòng 5 lần => 1 2 3 4 5
Dịch trái xoay vòng 6 lần => trở về giống như dịch trái xoay vòng 1 lần
Dịch trái xoay vòng 7 lần => trở về giống như dịch trái xoay vòng 2 lần
Source code:
void DichXoayVong(int a[], int n, int k, char t) // char t dùng để xác định dịch xoay vòng bên trái hay phải
{ // k là số lần dịch xoay vòng
while (k >= 5) // Nếu k >= 5 thì trừ k cho 5 vì bản chất, dịch xoay vòng 6 giống như dịch xoay vòng 1, dịch 7 giống dịch 2, ...
k -= 5;
for (int x = 0; x < k; x++)
{
if (t == 't') // t là trái (t)
{
int bienphu = a[0];
int Solan = 0;
for (int i = 0; i < n; i++)
{
if (Solan == n)
break;
if (i == n - 1)
a[i] = bienphu;
else
a[i] = a[i + 1];
Solan++;
}
}
else // ngược lại là phải (p)
{
int bienphu = a[n - 1];
int Solan = 0;
for (int i = n - 1; i >= 0; i--)
{
if (Solan == n)
break;
if (i == 0)
a[i] = bienphu;
else
a[i] = a[i - 1];
Solan++;
}
}
}
}
Mình xin nhờ mọi ngưới góp ý và cải thiện thuật toán của mình với bài toán trên cho ngắn gọn - tối ưu hơn (vì code của mình trong có vẻ dài dòng và lưa thưa)
Xin cảm ơn mọi người nhiều !