I've got a question.. why
Code:
power9 = 9*9*9*9*9;
instead of:
Code:
power9 = 59049; // floor(pow(9,5)), or 9*9*9*9*9
That would save some cyckles, but most of your
intelligent compilers will automaticaly sort that out.
With a bit of optimazation, gcc will give you something like this:
Code:
.LC0:
.string "%u\n"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
pushl %ebx
subl $28, %esp
andl $-16, %esp
.p2align 4,,15
.L2:
movl stdin, %ebx
movl $1, %eax
movl $1, %ecx
movl %eax, 8(%esp)
leal -13(%ebp), %edx
movl %ecx, 4(%esp)
movl %ebx, 12(%esp)
xorl %ebx, %ebx
movl %edx, (%esp)
call fread
testl %eax, %eax
je .L19
.p2align 4,,15
.L5:
movzbl -13(%ebp), %edx
cmpb $10, %dl
je .L6
leal 0(,%ebx,8), %ecx
movl stdin, %esi
movsbl %dl,%edi
subl %ebx, %ecx
movl $1, %edx
leal -48(%edi,%ecx), %ebx
movl %edx, 4(%esp)
movl $1, %ecx
leal -13(%ebp), %edx
movl %esi, 12(%esp)
movl %ecx, 8(%esp)
movl %edx, (%esp)
call fread
testl %eax, %eax
jne .L5
.L6:
movl %ebx, 4(%esp)
movl $59049, %esi
movl $954437177, %edi
movl $.LC0, (%esp)
call printf
.p2align 4,,15
.L15:
movl %ebx, %eax
xorl %edx, %edx
movl stdout, %ecx
divl %esi
movl %ecx, 12(%esp)
movl $1, %ecx
movl %ecx, 4(%esp)
movl %edx, %ebx
addb $48, %al
movb %al, -13(%ebp)
movl $1, %edx
movl %edx, 8(%esp)
leal -13(%ebp), %edx
movl %edx, (%esp)
call fwrite
movl %esi, %eax
mull %edi
shrl %edx
testl %edx, %edx
movl %edx, %esi
jne .L15
movb $10, -13(%ebp)
movl stdout, %edi
movl $1, %esi
movl %esi, 8(%esp)
movl $1, %ebx
leal -13(%ebp), %eax
movl %ebx, 4(%esp)
movl %edi, 12(%esp)
movl %eax, (%esp)
call fwrite
jmp .L2
.L19:
leal -12(%ebp), %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.size main, .-main
Now with hand uptimazation there are a few instructions which could be eliminated, but execution time would probably be unaffected.