#include <iostream>
#include <vector>
std::vector<int> divisors(int n)
{
std::vector<int> a;
for (int i = 1; i <= n; ++i)
if (n % i == 0)
a.push_back(i);
return a;
}
int main()
{
auto a = divisors(10);
for (int x : a) std::cout << x << ' ';
//hoặc dài dòng hơn
std::vector<int> a = divisors(10);
for (int i = 0; i < a.size(); ++i)
std::cout << a[i] << ' ';
}
vậy thì em phải có 1 con trỏ sẵn ở chỗ trả về, rồi truyền con trỏ này vào cái hàm tìm ước kia. Trong hàm truyền ước duyệt 2 lần, lần đầu tiên đếm xem n có bao nhiêu ước, rồi cấp phát bộ nhớ cho đủ, rồi vòng lặp thứ 2 cho các ước đó vào
int* getDivisors(int n, int& count)
{
// đếm xem n có bao nhiêu ước
count = 0;
for (int i = 1; i <= n; ++i)
if (n % i == 0)
count++;
// cấp phát bấy nhiêu chỗ trống cho mảng a
int* a = new int[count];
// copy các ước đó vào mảng a
for (int i = 1, j = 0; i <= n; ++i)
if (n % i == 0)
a[j++] = i;
return a;
}
int main()
{
int count;
int* a = getDivisors(10, count);
for (int i = 0; i < count; ++i)
std::cout << a[i] << " ";
// nhớ phải giải phóng a sau khi xài xong
delete[] a;
}
xài thẳng vector cho nó khỏe, khỏi phải nhớ cấp phát bao nhiêu, giải phóng lúc nào, khỏi cần biến count phụ trợ để biết a có bao nhiêu phần tử, v.v…, và viết hàm trả về thẳng cái mảng cho dễ hiểu thay vì phải trả về con trỏ
C++ thì bạn trả về cái gì cũng được hết á. Vô tư.
Nhưng sau này bạn học lên cao thì phải hiểu cách nó làm thế nào trong stack, để còn optimize nữa.
nếu nó trả về mảng thì lưu thế nào ạ
bài toán tìm các ước của 1 số ,muốn nó return tất cả các ước thì làm sao ạ
trả về
std::vector<int>
nếu muôn tự viết hàm thì viết sao ạ
tự viết hàm là sao…
ko dùng đến thư viện vector
vậy thì em phải có 1 con trỏ sẵn ở chỗ trả về, rồi truyền con trỏ này vào cái hàm tìm ước kia. Trong hàm truyền ước duyệt 2 lần, lần đầu tiên đếm xem n có bao nhiêu ước, rồi cấp phát bộ nhớ cho đủ, rồi vòng lặp thứ 2 cho các ước đó vào
xài thẳng
vector
cho nó khỏe, khỏi phải nhớ cấp phát bao nhiêu, giải phóng lúc nào, khỏi cần biếncount
phụ trợ để biết a có bao nhiêu phần tử, v.v…, và viết hàm trả về thẳng cái mảng cho dễ hiểu thay vì phải trả về con trỏsố là do mình nhâp vào nên chỗ n%i==0 có vẻ ko đúng a ạ
Anh cho em hỏi tại sau ở đây lại dùng keywork auto?
Để tự động xác định kiểu cho biến
a
gán vớidivisors(10)
.Bạn google “auto c++11”.
cảm ơn anh! Chứ hồi đó em đọc thì có auto thì cũng như không có auto! Nên em thắc mắc! vậy là em chậm công nghệ rồi!
do lười…
std::vector<int>
vsauto
cái nào dễ hơnChào anh tntxtnt!
tại em không biết nên hỏi chứ không có gì hết anh! Mà nhờ anh em mới biết thêm C++ 11
trong C thì HOÀN TOÀN ĐƯỢC, bạn chỉ cần hiểu về con trỏ là được