学习完移位操作符之后想要通过移位操作符与加减法代替乘除,但很遗憾只完成了乘法部分的改造,除法未能实现,望各位大佬指点一二。
1.打印菜单,利用水平制表符将文字打印在屏幕中央
void menu(void) //打印菜单
{
printf("\t\t加法( a )\n");
printf("\t\t减法( s )\n");
printf("\t\t乘法( m )\n");
printf("\t\t除法( d )\n");
printf("\t\t退出( e )\n");
}
2.加减法不过多赘述。
int add(int a, int b) //加法
{
return a + b;
}
int sub(int a, int b) //减法
{
return a - b;
}
3.利用递归调用函数,取尽某一乘数所包含的2,再利用<<操作符代替a*2操作
int mul(int a, int b) //乘法
{
int num = 0;
int count = 0;
if (a > b)
{
int chag = a;
a = b;
b = chag;
}
int org = b; // org 保存b的初始值
int org_a = a;// 保存a的初始值
while (a >= 2) //判断a是2的几次方
{
a = a >> 1;
++count;
}
num = org_a - (1<<count); //记录a的初始值还剩多少
while (count) //b乘2的count次方
{
b = b << 1; //使用移位操作符代替乘2
--count;
}
if (num >= 2) //a初始值剩下的值大于2,递归调用mul函数
{
b = b + mul(num, org);
}
else if (num)
{
b = org + b;
}
return b;
}
4.主函数,功能选择的实现。
int main(void)
{
menu();
printf("请选择 :\n");
int a = 0; //
int b = 0; // a,b存储参数
int ret = 0; //记录函数返回值
int input = getchar(); //获取要实现的功能
while (1)
{
printf("请输入两个参数");
int ret_num = scanf("%d %d", &a, &b); //获取参数
switch (input)
{
case 'a':
ret = add(a, b);
break;
case 's':
ret = sub(a, b);
break;
case 'm':
ret = mul(a, b);
break;
case 'd':
ret = div(a, b);
break;
case 'e':
return 0;
break;
default :
break;
}
printf("\n%d\n", ret); //打印结果
}
return 0;
}