想了想 决定还是发在 c 版,毕竟是 c 内联汇编语法为主 题目是 已知的 5 位正整数
求满足 abcde=a^5+b^5+c^5+d^5+e^5 这样的5位数都有谁?答案是
54748
92727
93084
下面主要是用vs2010+c+内联汇编 编写 有不足之处还请各位大虾指点
程序代码:
#include <stdio.h> int mypow(int x,int n) { int t; _asm { mov eax,1; mov ecx,n; lp: imul eax,x; sub ecx,1; cmp ecx,0; jle ex; jmp lp; ex: mov t,eax; } return t; } void split(int s,int* a1,int* a2,int* a3,int* a4,int* a5) { _asm { mov eax,dword ptr [s]; cdq; mov ecx,10; idiv ecx; mov dword ptr [s],eax; mov eax,dword ptr a5; mov dword ptr [eax],edx; // mov eax,dword ptr [s]; cdq; mov ecx,10; idiv ecx; mov dword ptr [s],eax; mov eax,dword ptr a4; mov dword ptr [eax],edx; // mov eax,dword ptr [s]; cdq; mov ecx,10; idiv ecx; mov dword ptr [s],eax; mov eax,dword ptr a3; mov dword ptr [eax],edx; // mov eax,dword ptr [s]; cdq; mov ecx,10; idiv ecx; mov dword ptr [s],eax; mov eax,dword ptr a2; mov dword ptr [eax],edx; // mov eax,dword ptr [s]; cdq; mov ecx,10; idiv ecx; mov dword ptr [s],eax; mov eax,dword ptr a1; mov dword ptr [eax],edx; } } int main() { int s,a1,a2,a3,a4,a5; int t; char* fmt="%5d\n"; _asm { mov eax,10000; beg: mov dword ptr [t],eax; // t 用来保存循环变量 cmp eax,99999; jg end; //大于则跳转至循环结束 //以上循环头 mov s,eax; lea ecx,dword ptr [a5]; push ecx; lea ecx,dword ptr [a4]; push ecx; lea ecx,dword ptr [a3]; push ecx; lea ecx,dword ptr [a2]; push ecx; lea ecx,dword ptr [a1]; push ecx; mov ecx,dword ptr [s]; push ecx; call split; //对五位数进行分割 add esp,24; // xor esi,esi; push 5; mov ecx,dword ptr [a5]; push ecx; call mypow; add esi,eax; //调用幂函数并对结果进行累加 add esp,8; push 5; mov ecx,dword ptr [a4]; push ecx; call mypow; add esi,eax; //调用幂函数并对结果进行累加 add esp,8; push 5; mov ecx,dword ptr [a3]; push ecx; call mypow; add esi,eax; //调用幂函数并对结果进行累加 add esp,8; push 5; mov ecx,dword ptr [a2]; push ecx; call mypow; //调用幂函数并对结果进行累加 add esi,eax; add esp,8; push 5; mov ecx,dword ptr [a1]; push ecx; call mypow; add esi,eax; //调用幂函数并对结果进行累加 add esp,8; cmp esi,dword ptr [t]; jnz exit0; //不相等则跳至下一次循环 //如果相等则打印输出 mov ecx,dword ptr [t]; push ecx; mov ecx,dword ptr fmt; push ecx; call dword ptr printf; add esp,8; exit0: mov eax,dword ptr [t]; //进行下一次循环 add eax,1; jmp beg; end: } return 0; }