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

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

您可以使用此function

 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; } 

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

 void main(){ int a,b,i=0; clrscr(); printf("Enter the dividend and divisor"); scanf("%d%d",&a,&b); while(a>=b){ a=ab; i++; } printf("qoutient is :%d \n remainder : %d",i,a); getch(); } 

最简单的方法:

 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; } 

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

 #include  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); 

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

======

 -(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>(numbeMaxBit -bits); } 

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

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

用于测试的代码:

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

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

如果需要小数答案,可以使用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  #include  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); 

}

python中的Psuedo代码除以常量

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

den =除数

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

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