具体代码如下,直接运行即可。
#include <stdio.h>
int main()
{
int i, a = 0, b = 0, c = 0, flag = 3; // flag相当于指针来指明Q的位置
char x[6], y[6];
int R[6], Q[6], yb[6], y1[6]; // yb是-y的补码,y1为绝对值y
printf("请输入X(带一位符号位四位数值位的二进制数,如+1011):");
scanf("%5s", x);
while ((c = getchar()) != '\n' && c != EOF); // 清除缓冲区中的剩余字符
printf("请输入Y(带一位符号位四位数值位的二进制数,如-1101):");
scanf("%5s", y);
// printf("X=%s\n",x);
// printf("Y=%s\n",y);
y1[0] = 0; // 绝对值y一定是正的,符号位为0
for (i = 4; i >= 1; i--)
{
if (y[i] == '1')
{ // 将字符型的y变成int型的绝对值y
y1[i] = 1;
}
else
y1[i] = 0;
}
// printf("y的绝对值y1:");
// for (i = 0; i <= 4; i++)
// {
// printf("%d", y1[i]);
// }
// printf("\n");
if (x[0] == '+')
{
a = 0;
x[0] = '0'; // 符号位计算
}
else // 这里我怀疑是有点问题,先加个大括号先,出问题再删
{ a = 1;
x[0] = '1';
}
if (y[0] == '+')
{
b = 0;
y[0] = '0';
}
else // 这里我怀疑是有点问题,先加个大括号先,出问题再删
{ b = 1;
y[0] = '1';
}
if (a + b == 1) //只有一个1一个0,异号的时候才结果为负
{
c = 1;
}
else
c = 0; // c为符号位
yb[0] = 1;
for (i = 4; i >= 0; i--)
{ //-y的补码计算
if (y1[i] == 1) //!!!我这里把y改成了y1
yb[i] = 0; // 取反
//我这里不取反试试
// yb[i] = 1;
else
yb[i] = 1;
//我这里不取反试试
// yb[i] =0;
}
// printf("y1取反后的值:");
// for (i = 0; i <= 4; i++)
// {
// printf("%d", yb[i]);
// }
// printf("\n");
yb[4] = yb[4] + 1; // 末尾加一
for (i = 4; i > 0; i--)
{
if (yb[i] == 2)
{ // 满2进一位
yb[i] = 0;
yb[i - 1] += 1;
}
if (yb[i] == 3)
{ // 满3进一位 且留下1
yb[i] = 1;
yb[i - 1] += 1;
}
}
// printf("-y1的补码yb为:");
// for (i = 0; i <= 4; i++)
// {
// printf("%d", yb[i]);
// }
// printf("\n");
for (i = 4; i >= 0; i--)
{
Q[i] = 0; // 给Q赋初值
}
R[0] = 0; // 设置余数
for (i = 4; i >= 1; i--)
{ // 给R做初始化
if (x[i] == '1')
R[i] = 1;
else
R[i] = 0;
}
// printf("R的初始值:"); // 余数符号位为0 数值位为x的值
// for (i = 0; i <= 4; i++)
// {
// printf("%d", R[i]);
// }
// printf("\n");
while (flag >= 1)
{ // 当flag=1时相当于全部除完
if (flag == 1)
{ // 最后一步不移位 单独提出来
for (i = 4; i >= 0; i--)
{ // 余数R加上-y的补码
R[i] += yb[i];
if (R[i] == 2)
{ // 满2进一位
R[i] = 0;
R[i - 1] += 1;
}
if (R[i] == 3)
{ // 满3进一位 且留下1
R[i] = 1;
R[i - 1] += 1;
}
}
if (R[0] == 1)
{ // 若符号位为1 说明不够减 再加y恢复余数,不够减Q=0
Q[4] = 0;
}
else
Q[4] = 1;
break;
}
for (i = 4; i >= 0; i--)
{ // 余数R加上-y的补码
R[i] += yb[i];
if (R[i] == 2)
{ // 满2进一位
R[i] = 0;
R[i - 1] += 1;
}
if (R[i] == 3)
{ // 满3进一位 且留下1
R[i] = 1;
R[i - 1] += 1;
}
}
if (R[0] == 1)
{ // 若符号位为1 说明不够减 再加y恢复余数,不够减Q=0
Q[4] = 0;
flag -= 1; // 向左移动一位
for (i = 4; i >= 1; i--)
{
R[i] += y1[i];
if (R[i] == 2)
{ // 满2进一位
R[i] = 0;
R[i - 1] += 1;
}
if (R[i] == 3)
{ // 满3进一位 且留下1
R[i] = 1;
R[i - 1] += 1;
}
} // 不够减先恢复余数再左移
for (i = 0; i <= 3; i++)
{ // 左移
R[i] = R[i + 1];
}
//!!! 这里应该是逻辑左移的,所以我重新设为0
// R[4] = Q[0]; // 将Q的第一个移动给R
R[4] = 0 ;
for (i = 0; i <= 3; i++)
{ // 左移
Q[i] = Q[i + 1];
}
} // 恢复后R[0]符号位又变成了0
else
{ // 够减直接左移
Q[4] = 1; // 够减Q为1
flag -= 1; // 向左移动一位
for (i = 0; i <= 3; i++)
{ // 左移
R[i] = R[i + 1];
}
//!!! 还是逻辑左移设为0
// R[4] = Q[0]; // 将Q的第一个移动给R
R[4] = 0;
for (i = 0; i <= 3; i++)
{ // 左移
Q[i] = Q[i + 1];
}
}
}
printf("商Q的值:");
for (i = 0; i <= 4; i++)
{
printf("%d", Q[i]);
}
printf("\n");
printf("余数R的值:0.000");
for (i = 0; i <= 4; i++)
{
printf("%d", R[i]);
}
printf("\n");
printf("X/Y=%d.", c);
for (i = 1; i <= 4; i++)
{
printf("%d", Q[i]);
}
printf("\n");
return 0;
}