-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathprod4br.c
54 lines (43 loc) · 852 Bytes
/
prod4br.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <stdio.h>
#include <stdlib.h>
void vassume(int b){}
void vtrace1(int x, int y, int a, int b, int p, int q){}
//void vtrace2(int x, int y, int a, int b, int p, int q){}
int mainQ(int x, int y){
vassume(x>=1);
vassume(y>=1);
int a,b,p,q;
a = x;
b = y;
p = 1;
q = 0;
while(1) {
//assert(q+a*b*p==x*y);
vtrace1(x, y, a, b, p, q);
if(!(a!=0 && b!=0)) break;
if (a % 2 ==0 && b % 2 ==0 ){
a = a/2;
b = b/2;
p = 4*p;
}
else if (a % 2 ==1 && b % 2 ==0 ){
a = a-1;
q = q+b*p;
}
else if (a % 2 ==0 && b % 2 ==1 ){
b = b-1;
q = q+a*p;
}
else {
a = a-1;
b = b-1;
q = q+(a+b+1)*p;
}
}
//assert(q == x*y);
//vtrace2(x, y, a, b, p, q);
return q;
}
void main(int argc, char **argv){
mainQ(atoi(argv[1]), atoi(argv[2]));
}