Để thay thế thao tác các chữ số riêng biệt, như được thực hiện trong các giải pháp đệ quy và các giải pháp sử dụng Vector <>, bạn có thể dựa vào biểu diễn máy và số học. Điều này không nhanh hơn nếu bạn cần kiểm tra từng chữ số mỗi lần qua vòng lặp, nhưng nếu bạn đang triển khai một trình lặp thì nó sẽ giảm dung lượng lưu trữ của bạn trong vòng lặp và nếu bạn không sử dụng mọi giá trị thì nó cũng có thể cải thiện hiệu quả của bạn. Trong mọi trường hợp, đó là một cách tiếp cận tương đương thú vị. Đây là ...
Đầu tiên hãy suy nghĩ về trường hợp chung chung hơn một chút, nơi bạn có n
vòng lặp lồng nhau, mỗi vòng được đếm từ 0 đến num
. Trong trường hợp đó, về cơ bản bạn chỉ cần đếm từ 0 đến num^n - 1
trong số cơ sở.Vì vậy, bạn có thể làm một cái gì đó như thế này:
for(int x=0; x<(num^n); x++)
{
int digit_0 = x % num;
int digit_1 = (x/num) % num;
int digit_2 = (x/num^2) % num;
// etc.
}
Lưu ý rằng:
- Nếu không có loại nguyên tự nhiên là đủ lớn cho ứng dụng của bạn, sau đó bạn sẽ phải sử dụng một số loại lớp số nguyên lớn. Điều này sẽ làm giảm hiệu quả của các bộ phận lưu trữ và gia tăng, mặc dù có thể không nhiều bằng cách sử dụng một vectơ có chiều dài num.
- Nếu bạn thực sự nhìn vào mỗi chữ số mỗi lần, sau đó bạn cần một vectơ chữ số, và bạn chưa đạt được gì cả. Điều này thực sự hữu ích nhất khi bạn không nhìn vào tất cả các chữ số mỗi lần.
- Tất cả các ước số phải được precomputed, vì vậy bạn cần phải giữ xung quanh một vector cho điều đó!
Dù sao, đối với câu hỏi cụ thể của bạn, bạn không muốn đếm đến num
mỗi lần, bạn muốn đếm đến num - (the sum of the already decided digits)
. Cách đơn giản nhất để giải thích điều này đơn giản bằng cách đặt một điều kiện thích hợp continue
vào vòng lặp của bạn. Dưới đây là là với một số giá trị thay thế trong khi n=2
và num=10
:
for(x=0; x<100; x++) // i.e. x < num*num
{
int ones = x%10; // i.e. x % num
int tens = (x/10) % 10; // i.e. (x/num) % num
if(ones + tens < 10)
{
// actually do work
}
}
(Trong trường hợp đó là không rõ ràng, tôi không có nghĩa là bạn thực sự cần sử dụng 100 và 10 trong các mã, đây chỉ là một ví dụ minh họa .)
Bạn có thể làm điều này hiệu quả hơn bằng cách tính toán số tiền tăng x, hoặc bằng cách giảm phạm vi x và sau đó ánh xạ trực tiếp đến không gian con thay vì toàn bộ không gian. (Nhưng trong 2-d và 3-d bạn đang sử dụng chính xác một nửa các giá trị có thể, do đó công việc bổ sung sẽ chỉ giúp bạn tăng tốc độ 2. Tôi nghĩ nó giống nhau khi n> 3, nhưng tôi quá lười biếng để tìm ra nó ngay bây giờ, xin lỗi!)
Bạn cần làm cho hàm của bạn đệ quy. Có một đối số xác định có bao nhiêu vòng lặp lồng nhau vẫn còn để chạy. Khi nó bằng không, làm "thang" của nó. :-P Tôi rất sẵn lòng trợ giúp thêm nữa khi tôi thấy nỗ lực đầu tiên của bạn về vấn đề này. :-) –
Nếu đây là bài tập về nhà, hãy gắn nhãn cho nó, nếu không, bạn sẽ tự giúp mình bằng cách nêu rõ trường hợp kinh doanh của bạn. –
Đây có phải là bài tập về nhà không? Những gì bạn đã đưa ra cho đến nay? – womp