在c中不使用除法运算符来除数

时间:2014-01-12 12:36:53

标签: c

如何在不使用这些运算符('*', '/', '%')的情况下将数字除以未知数字。分母是在运行时给出的。

8 个答案:

答案 0 :(得分:14)

void main(){
   int a,b,i=0;
   clrscr();
   printf("Enter the dividend and divisor");
   scanf("%d%d",&a,&b);
   while(a>=b){
      a=a-b;
      i++;
   }

   printf("qoutient is :%d \n remainder : %d",i,a);
   getch();
}

答案 1 :(得分:6)

您可以使用此功能

int divide(int nu, int de) {

    int temp = 1;
    int quotient = 0;

    while (de <= nu) {
        de <<= 1;
        temp <<= 1;
    }

    //printf("%d %d\n",de,temp,nu);
    while (temp > 1) {
        de >>= 1;
        temp >>= 1;

        if (nu >= de) {
            nu -= de;
            //printf("%d %d\n",quotient,temp);
            quotient += temp;
        }
    }

    return quotient;
}

您可以将分子和分母传递给此函数并获得所需的商。

答案 2 :(得分:2)

最简单的方法:

int divideIntegers(int num, int den){
    int sign = (num*den < 0)? -1 : 1;
    num = abs(num);
    den = abs(den);
    int quo = 0;
    while( (num -= den) >= 0 )
        quo++;
    return sign*quo;
}

答案 3 :(得分:1)

对于整数除法,您可以使用标准库中的divldivlldiv函数:

#include <stdlib.h>
div_t div(int numer, int denom);
ldiv_t ldiv(long int numer, long int denom);
lldiv_t lldiv(long long int numer, long long int denom);

答案 4 :(得分:1)

下面的方法是二进制除法的实现,考虑到两个数字都是正数。如果减法是一个问题,我们也可以使用二元运算符来实现。

==

-(int)binaryDivide:(int)numerator with:(int)denominator
{

    if (numerator ==0 || denominator ==1) {
        return numerator;
    }

    if (denominator ==0) {

#ifdef DEBUG
        NSAssert(denominator==0, @"denominator should be greater then 0");
#endif
        return INFINITY;
    }


//    if (numerator <0) {
//        numerator = abs(numerator);
//    }




    int maxBitDenom = [self getMaxBit:denominator];
    int maxBitNumerator = [self getMaxBit:numerator];
    int msbNumber = [self getMSB:maxBitDenom ofNumber:numerator];

    int qoutient = 0;

    int subResult = 0;

    int remainingBits = maxBitNumerator-maxBitDenom;


    if(msbNumber>=denominator){
        qoutient |=1;
        subResult = msbNumber- denominator;
    }
    else{
        subResult = msbNumber;
    }


    while(remainingBits>0){
        int msbBit = (numerator & (1<<(remainingBits-1)))>0?1:0;
        subResult = (subResult <<1) |msbBit;
        if(subResult >= denominator){
            subResult = subResult-denominator;
            qoutient= (qoutient<<1)|1;
        }
        else{
            qoutient = qoutient<<1;
        }
        remainingBits--;

    }
    return qoutient;
}

-(int)getMaxBit:(int)inputNumber
{
    int maxBit =0;
    BOOL isMaxBitSet = NO;
    for(int i=0;i<sizeof(inputNumber)*8;i++){
        if( inputNumber & (1<<i) ){
            maxBit = i;
            isMaxBitSet=YES;
        }
    }
    if (isMaxBitSet) {
        maxBit+=1;
    }
    return maxBit;
}



-(int)getMSB:(int)bits ofNumber:(int)number
{
    int numbeMaxBit = [self getMaxBit:number];
    return number>>(numbeMaxBit -bits);
}

答案 5 :(得分:0)

你的问题很模糊, 但是我可以给你一个将数字除以2的特殊情况。它可以通过将第一个位置向右移位的位移操作来执行。这是强度降低优化的一种形式。

例如,二进制(十进制数104)的1101000,向右移动一位,是0110100(十进制数52):删除最低位,即1。类似地,可以通过右移k个位置来执行除以2的任何幂(2 pow k)的除法。因为位移通常比除法快得多。

用于测试的代码:

#include <stdio.h>

main()
{
   int i = 104; 
   int k = 3; //
   int j = i >> k ; //==>  i / 2 pow k 
  printf("j = %d \n",j);
}

答案 6 :(得分:0)

这是解决问题的一种非常简单的方法;使用循环和基本[+ - ]运算符。

如果您需要小数答案,可以使用times_ten和divide_by_ten函数。在这种情况下,你应该看一下atoi()函数; times_ten将在char数组中提取整数,在将其转换回整数之前最后添加一个'0'。 divide_by_ten将存储整数的最后一个字符,用'。'减去该字符。并将存储的最后一个数字添加回数组,然后再将其转换回整数。 Atoi()将根据我们在char数组中操作的小数来舍入整数。

这是一个仅支持整数结果的版本,有一个额外的函数(leftover_division())替换'%' - 运算符。 [b]将指向整数而不是常规整数的指针传递给divide_rounded()函数并调整divide_rounded()中'a'的值应该使剩余函数变得多余,如果你需要知道它,可以节省大量的计算时间lefover。[/ b]

#include <stdio.h>
#include <stdlib.h>



int divide_rounded(int a, int b){
   int outcome_rounded = 0;
   while(a > b){
      a = a - b;
      outcome_rounded ++;
   }
   return outcome_rounded;
}

int leftover_division(int a, int b){
   while (a >= b){
      a = a - b;
   }
   return a;//this will return remainder

}

main(){
   int number = 20;
   int divisor = 3;
   int outcome;
   int leftover;

   outcome = divide_rounded(number, divisor);
   leftover = leftover_division(number, divisor);

   printf("[%d] divided by [%d] = [%d] + [%d]\n", number, divisor, outcome, leftover);

}

答案 7 :(得分:0)

python中的Psuedo代码除以常量

n_bits =预期分区准确的输入位数

den = divisor

prec = int(math.ceil(math.log(den,2)))
shift = n_bits + prec
mult = int(math.ceil((1<<shift)/float(den)))
answer = (x*mult) >> shift
err = sum([round(x/den) - ((x*mult) >> shift) for x in range(1<<n_bits)])

乘法可以通过移位实现并添加

相关问题