আইএ -32 মেশিন কোড, 27 বাইট
Hexdump:
60 33 db 8b f9 33 c0 92 43 50 f7 f3 85 d2 75 04
ab 93 ab 93 3b c3 5a 77 ec 61 c3
উত্স কোড (এমএস ভিজ্যুয়াল স্টুডিও সিনট্যাক্স):
pushad;
xor ebx, ebx;
mov edi, ecx;
myloop:
xor eax, eax;
xchg eax, edx;
inc ebx;
push eax;
div ebx;
test edx, edx;
jnz skip_output;
stosd;
xchg eax, ebx;
stosd;
xchg eax, ebx;
skip_output:
cmp eax, ebx;
pop edx;
ja myloop;
popad;
ret;
প্রথম প্যারামিটার ( ecx
) আউটপুটটির জন্য একটি পয়েন্টার, দ্বিতীয় প্যারামিটার ( edx
) হয়। এটি কোনওভাবেই আউটপুটের শেষ চিহ্নিত করে না; তালিকার শেষের সন্ধানের জন্য জিরোসের সাথে আউটপুট অ্যারেটি প্রিফিল করা উচিত।
একটি সম্পূর্ণ সি ++ প্রোগ্রাম যা এই কোডটি ব্যবহার করে:
#include <cstdint>
#include <vector>
#include <iostream>
#include <sstream>
__declspec(naked) void _fastcall doit(uint32_t* d, uint32_t n) {
_asm {
pushad;
xor ebx, ebx;
mov edi, ecx;
myloop:
xor eax, eax;
xchg eax, edx;
inc ebx;
push eax;
div ebx;
test edx, edx;
jnz skip_output;
stosd;
xchg eax, ebx;
stosd;
xchg eax, ebx;
skip_output:
cmp eax, ebx;
pop edx;
ja myloop;
popad;
ret;
}
}
int main(int argc, char* argv[]) {
uint32_t n;
std::stringstream(argv[1]) >> n;
std::vector<uint32_t> list(2 * sqrt(n) + 3); // c++ initializes with zeros
doit(list.data(), n);
for (auto i = list.begin(); *i; ++i)
std::cout << *i << '\n';
}
আউটপুটটিতে কিছু বিভ্রান্তি রয়েছে, যদিও এটি অনুমান অনুসরণ করে (বাছাইয়ের প্রয়োজন নেই; স্বতন্ত্রতার প্রয়োজন নেই)।
ইনপুট: 69
আউটপুট:
69
1
23
3
বিভাজকরা জোড়ায়।
ইনপুট: 100
আউটপুট:
100
1
50
2
25
4
20
5
10
10
নিখুঁত স্কোয়ারগুলির জন্য, শেষ বিভাজকটি দুটিবার আউটপুট হয় (এটি নিজের সাথে একটি জুড়ি)।
ইনপুট: 30
আউটপুট:
30
1
15
2
10
3
6
5
5
6
যদি ইনপুটটি নিখুঁত বর্গক্ষেত্রের কাছাকাছি থাকে তবে শেষ জোড়াটি আউটপুট হয় দু'বার। এটি লুপে চেকের ক্রমের কারণে: প্রথমে এটি "বাকী = 0" এবং আউটপুটগুলির জন্য পরীক্ষা করে এবং কেবল তখন এটি লুপ থেকে বেরিয়ে যাওয়ার জন্য "ভাগফল <বিভাজক" এর জন্য পরীক্ষা করে।
O(sqrt(n))
।