IA-32 기계 코드, 27 바이트
16 진 덤프 :
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
소스 코드 (MS Visual Studio 구문) :
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
)는 숫자입니다. 어떤 식 으로든 출력의 끝을 표시하지 않습니다. 목록의 끝을 찾기 위해 출력 배열을 0으로 미리 채워야합니다.
이 코드를 사용하는 완전한 C ++ 프로그램 :
#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
입력이 완벽한 정사각형에 가까우면 마지막 쌍이 두 번 출력됩니다. 루프의 검사 순서 때문입니다. 먼저 "remainder = 0"을 확인하고 출력 한 다음 "quotient <divisor"를 검사하여 루프를 종료합니다.
O(sqrt(n))