大一有关c语程的练习

定义函数divide使其的功能为:将给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%' 。结果去除小数部分。
代码如下:

int divide(int a, int b){
    //将除法转换成加法,用atri记录计算次数,用flage来标记最终结果的符号
    long atri=0,flage=-1;

    //将a,b分别转换为正数并得出计算结果的符号
    if(a<0){
        a=-(unsigned)a;
        flage++;
    }
    if(b<0){
        b=-(unsigned)b;
        flage++;
    }

    //开始计算
    if(a>b){


        while(a>0){
            a -= b;
            atri++;
        }

                //输出计算结果
        if(flage==0) return -(atri-1);
        else return (atri-1);
    }else if(a==b){         //将相同数的计算结果单独输出

        if(flage==0) return -1;
        else return 1;
    }else{                  //a绝对值相对更小时直接输出0

        return 0;
    }
}

运算结果出现错误的例子为:

img

可参考

int divide(int dividend, int divisor){
    int result = 0;
    int flag,t,d,i;
    if(dividend == 0){
        return 0;
    }else if(dividend == INT_MIN && divisor == -1){
        return INT_MAX;
    }else if(dividend == INT_MIN && divisor == 1){
        return INT_MIN;
    }else if(dividend == INT_MIN && divisor == INT_MAX){
        return -1;
    }else if(dividend == divisor){
        return 1;
    }else if(divisor == INT_MIN){
        return 0;
    }
    flag = (dividend^divisor)<0;
    
    if(dividend == INT_MIN){
        dividend += abs(divisor);
        result++;
    }
    t = abs(dividend),d = abs(divisor);
    for(i=31;i>-1;i--){
        if((t>>i) >= d){
            result += 1<<i;
            t -= d<<i;
        }
    }
    if(result == INT_MIN){
        return INT_MIN;
    }else{
        return flag ?-result:result;
    }
    return 0;
}
int main(void)
{
    int n,m;
    while(1)
    {
        printf("input:");
        scanf("%d %d",&n,&m);
        printf("%d\n",divide(n,m));
    }

    return 0;
}

img