python分数由高至低排序_排序数字。Sorta

C + x86组件,636

我知道这不会赢,但是感觉太不自然了,我不得不分享。没有数组或字符串(只要不计算输入参数)。其位数受32位范围的限制。

所以这是我所做的一些解释:

我以为我会在不使用任何数组或字符串的情况下执行此操作,然后想到了递归,但是当然,有了递归,我将无法从其他递归调用中交换值……然后我意识到有办法 将我的C程序与汇编函数链接起来后,我可以跳入堆栈并返回指向所需调用的基本指针的指针,这就是“ recursionStackAt”函数的作用。当然recursionStackAt是一个非常丑陋的函数,它的结果不仅取决于输入或程序的状态,还取决于调用者本身。请注意,这就是让我将索引从0更改为1的原因。

事不宜迟,这里是代码:

#include

#include

int numberToSort;

int totalLength = 0;

int decreasing;

int* recursionStackAt(int pos); //Here's the magic

void swapAtStack(int pos1, int pos2) {

int a = *(recursionStackAt(pos1)+3);

*(recursionStackAt(pos1)+3) = *(recursionStackAt(pos2)+3);

*(recursionStackAt(pos2)+3) = a;

}

int getAt(i) {

return *(recursionStackAt(i)+3);

}

void printNumber(int len) {

int i = 0;

for(i = 1; i <= len; ++i) {

printf("%d",*(recursionStackAt(i)+3));

}

printf("\n");

}

void computeNextDigit(int remainingNumber, int nextDigit) {

if(remainingNumber == 0) {

//Bubble sort cause I was lazy and it's quite compact

++totalLength;

int i, j;

for(i = 1; i <= totalLength; ++i)

for(j = 1; j <= totalLength-1; ++j) {

if(decreasing) {

if(getAt(j) > getAt(j+1))

swapAtStack(j,j+1);

}

else {

if(getAt(j) < getAt(j+1))

swapAtStack(j,j+1);

}

}

printNumber(totalLength);

}

else {

++totalLength;

computeNextDigit(remainingNumber/10, remainingNumber%10);

}

}

int main(int argc, char* argv[]) {

if(argc == 3) {

numberToSort = atoi(argv[1]);

decreasing = atoi(argv[2]);

}

else exit(1);

computeNextDigit(numberToSort/10, numberToSort%10);

}

当然,recursionStackAt函数的x86(AT&T sintax,btw)汇编代码:

.text

.align 4

.globl recursionStackAt

.type recursionStackAt, @function

recursionStackAt:

pushl %ebp

movl %esp,%ebp

pushl %esi

movl $0, %esi #i = 0

movl (%ebp), %eax #pointer

while:

cmp %esi, 8(%ebp)

je endwhile

movl (%eax),%eax

incl %esi

jmp while

endwhile:

popl %esi

movl %ebp, %esp

popl %ebp

ret

输出上的一些示例:(1表示增加,0表示减少)

$ ./sortasort 6543210 1

0123456

$ ./sortasort 32507345 1

02334557

$ ./sortasort 32507345 0

75543320

这是混淆的版本(不可读,但工作正常):

因此,如果LibreOffice不撒谎,我的混淆代码由646个字符组成(没有空格,我应该算出它们吗?),并且在满足所有其他条件的情况下,对于递增/递减选择​​,我会得到-10。

哦,要编译它,您应该这样做(在类Unix系统上)

gcc -c [-m32] recursionStackAt.s

gcc -o sortasort [-m32] sortasort.c recursionStackAt.o

请注意,仅当您使用64位计算机时,-m32标志才可用。您还需要32位库进行编译。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值