c代码(只是整数处理情况):
#include <stdio.h>
#include <assert.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
int tmp = ~b; //反码
tmp = tmp + 1;//补码
return add(a, tmp);
}
int mul(int a, int b)
{
int i, ret = 0, flag = 0;
if ((a < 0&&b > 0)||(a > 0&&b < 0))
flag = 1;
if (a < 0)
a = ~a + 1;
if (b < 0)
b = ~b + 1;
for(i=0; i<b; i++)
ret = add(ret, a);
if (flag)
return ~ret + 1;
return ret;
}
int div(int a, int b)
{
int i = 0, ret = 0, flag = 0;
assert(0 != b);
if ((a < 0&&b > 0)||(a > 0&&b < 0))
flag = 1;
if (a < 0)
a = ~a + 1;
if (b < 0)
b = ~b + 1;
while (1) {
a = sub(a, b);
if (a >= 0)
i++;
else
break;
}
if (flag)
return ~i + 1;
return i;
}
int main()
{
printf("%d\n", sub(1,1));
printf("%d\n", sub(9,3));
printf("%d\n", sub(2,5));
printf("----------------\n");
printf("%d\n", mul(2,5));
printf("%d\n", mul(2,-5));
printf("%d\n", mul(-2,5));
printf("%d\n", mul(-2,-5));
printf("%d\n", mul(-2,0));
printf("%d\n", mul(0,3));
printf("----------------\n");
printf("%d\n", div(6,2));
printf("%d\n", div(16,-2));
printf("%d\n", div(-160,2));
printf("%d\n", div(-80,-8));
printf("%d\n", div(6,6));
printf("%d\n", div(1,6));
printf("%d\n", div(0,6));
printf("%d\n", div(1,0));
return 0;
}
结果:
0
6
-3
----------------
10
-10
-10
10
0
0
----------------
3
-8
-80
10
1
0
0
a.out: main.c:37: div: Assertion `0 != b' failed.
Aborted