具体代码如下,直接运行即可。
#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为绝对值yprintf("请输入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一定是正的,符号位为0for (i = 4; i >= 1; i--){if (y[i] == '1'){ // 将字符型的y变成int型的绝对值yy1[i] = 1;}elsey1[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;}elsec = 0; // c为符号位yb[0] = 1;for (i = 4; i >= 0; i--){ //-y的补码计算if (y1[i] == 1) //!!!我这里把y改成了y1yb[i] = 0; // 取反//我这里不取反试试// yb[i] = 1;elseyb[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进一位 且留下1yb[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;elseR[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进一位 且留下1R[i] = 1;R[i - 1] += 1;}}if (R[0] == 1){ // 若符号位为1 说明不够减 再加y恢复余数,不够减Q=0Q[4] = 0;}elseQ[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进一位 且留下1R[i] = 1;R[i - 1] += 1;}}if (R[0] == 1){ // 若符号位为1 说明不够减 再加y恢复余数,不够减Q=0Q[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进一位 且留下1R[i] = 1;R[i - 1] += 1;}} // 不够减先恢复余数再左移for (i = 0; i <= 3; i++){ // 左移R[i] = R[i + 1];}//!!! 这里应该是逻辑左移的,所以我重新设为0// R[4] = Q[0]; // 将Q的第一个移动给RR[4] = 0 ;for (i = 0; i <= 3; i++){ // 左移Q[i] = Q[i + 1];}} // 恢复后R[0]符号位又变成了0else{ // 够减直接左移Q[4] = 1; // 够减Q为1flag -= 1; // 向左移动一位for (i = 0; i <= 3; i++){ // 左移R[i] = R[i + 1];}//!!! 还是逻辑左移设为0// R[4] = Q[0]; // 将Q的第一个移动给RR[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;
}