如何在不使用这些运算符('*', '/', '%')
的情况下将数字除以未知数字。分母是在运行时给出的。
答案 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)
对于整数除法,您可以使用标准库中的div
,ldiv
或lldiv
函数:
#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)
例如,二进制(十进制数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)])
乘法可以通过移位实现并添加