| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
把计算的那段放外面去,把所有情况算出来放数组里In Reply To:这个题不打表怎么做?我用汇编写还超时啊 Posted by:frkstyc at 2005-03-07 17:50:25 其实和打表差不多,打表的计算在低下自己算
这题没别的方法
因为数据很多,虽然只有13种情况,但是它不停的重复
> int main(void)
> {
> int k;
> for(;;)
> {
> scanf("%d", &k);
> if(k == 0)
> {
> break;
> }
> __asm
> {
> mov edi, dword ptr [k]
> mov ebx, edi
> shl edi, 1
> _OLoop:
> mov ecx, edi
> mov eax, ebx
> xor edx, edx
> dec eax
> div ecx
> mov eax, edx
> _ILoop:
> mov edx, edi
> shr edx, 1
> cmp eax, edx
> jge _2ndBranch
> _1stBranch:
> cmp ecx, edx
> je _Found
> inc ebx
> jmp _OLoop
> _2ndBranch:
> dec ecx
> dec eax
> _AfterBranches:
> add eax, ebx
> xor edx, edx
> div ecx
> mov eax, edx
> jmp _ILoop
> _Found:
> mov dword ptr [k], ebx
> }
> printf("%d\n", k);
> }
> }
>
> 汇编那段相当于
> (ecx = n, ebx = m, eax = i, edi = k*2)
> int m, f = 0;
> for(m = k; f == 0; m++)
> {
> int n = k;
> int i;
> for(i = (m - 1) % n; ; i = (i + m) % n)
> {
> if(i < k >> 1)
> {
> if(n == k >> 1)
> {
> f = 1;
> }
> break;
> }
> else
> {
> n--;
> i--;
> }
> }
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator