在c语言中不使用除法运算符对数字进行除法
如何在不使用这些运算符(“*”、“/”、“%”)的情况下,将一个数字除以一个未知数字。分母在运行时给出。您可以使用此函数在c语言中不使用除法运算符对数字进行除法,c,C,如何在不使用这些运算符(“*”、“/”、“%”)的情况下,将一个数字除以一个未知数字。分母在运行时给出。您可以使用此函数 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);
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;
}
int除法(int-nu,int-de){
内部温度=1;
整数商=0;
而(de=1;
如果(nu>=de){
nu-=de;
//printf(“%d%d\n”,商,温度);
商+=温度;
}
}
返回商;
}
您可以将分子和分母传递给此函数并获得所需的商。对于整数除法,您可以使用标准库中的
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);
#包括
div_t div(整数、整数);
ldiv_t ldiv(长整数,长整数);
lldiv_t lldiv(长整型数,长整型数);
你的问题很模糊,
但我可以给你一个特殊的例子,将一个数字除以2。它可以通过一个位移位操作来执行,将数字1向右移位。这是一种强度降低优化的形式
例如,右移一位的二进制1101000(十进制数104)为0110100(十进制数52):删除最低阶位a 1。类似地,通过右移k位可以执行任意二次幂(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);
}
#包括
main()
{
int i=104;
int k=3//
int j=i>>k;//=>i/2功率k
printf(“j=%d\n”,j);
}
这是解决问题的一种非常简单的方法;使用循环和基本[+-]运算符
如果你需要一个小数的答案,你可以使用一个乘以十并除以十的函数;
times_ten将提取字符数组中的整数,在最后添加一个“0”,然后再将其转换回整数。
将_除以_-ten将存储整数的最后一个字符,将该字符减去“.”并将存储的最后一个数字添加回数组中,然后再将其转换回整数。Atoi()将根据我们在字符数组中操作的十进制数对整数进行四舍五入
这是一个仅支持整数结果的版本,用一个额外的函数(leftover_division())替换“%”运算符。
[b] 将指向整数的指针而不是常规整数的指针传递给divide_rounded()函数,并调整divide_rounded()中的“a”值,应该会使剩余函数变得多余,如果需要了解剩余值,则可以节省大量计算时间。[/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);
#包括
#包括
整数除以四舍五入(整数a、整数b){
int结果_四舍五入=0;
而(a>b){
a=a-b;
结果(四舍五入);
}
返回结果四舍五入;
}
整数剩余除法(整数a,整数b){
而(a>=b){
a=a-b;
}
返回一个;//这将返回余数
}
main(){
整数=20;
整数除数=3;
int结果;
int剩余物;
结果=四舍五入(数字、除数);
剩余=剩余除法(数字、除数);
printf(“[%d]除以[%d]=[%d]+[%d]\n”,数字、除数、结果、剩余);
}下面的方法是二进制除法的实现,考虑到两个数字都是正数。如果要考虑减法,我们也可以使用二进制运算符来实现 ======
-(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);
}
-(int)二进制除法:(int)分子与:(int)分母
{
如果(分子==0 | |分母==1){
返回分子;
}
如果(分母==0){
#ifdef调试
NSAssert(分母==0,@“分母应大于0”);
#恩迪夫
返回无穷大;
}
//if(分子=分母){
qoutient |=1;
子结果=msbNumber-分母;
}
否则{
子结果=msbNumber;
}
while(剩余位>0){
int msbBit=(分子和(1最简单的方式:
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;
}
int除法整数(int num,int den){
整数符号=(数值*密度<0)?-1:1;
num=abs(num);
den=abs(den);
int quo=0;
而((num-=den)>=0)
quo++;
返回标志*quo;
}
python中用于除以常量的Psuedo代码
n_bits=期望除法准确的输入位数
den=除数
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)])
prec=int(math.ceil(math.log(den,2)))
移位=n_位+prec
mult=int(数学单元((1个班次
err=sum([round(x/den)-(x*mult)>>shift)表示范围内的x(1float或int?有符号或无符号?什么时候卡住了?为什么?向我们展示一些代码并告诉我们卡住的地方。这不是“帮助你完成家庭作业”如果你被允许使用-in-loop控件,那么你应该看看:@vinayawsm你的编辑实质上改变了这个问题。事实上,使用加减法的答案并不意味着你应该改变这个问题以允许它们的使用。你使用的是-
操作符…@V-X抱歉,但是使用+或-opera很好tors。我实际上是想在不使用“/”和“%”运算符的情况下为编写代码。您还需要检查参数是否为负/正。Downvoter,请解释一下您的downvote?调用这些函数是否使用了任何禁止的运算符?不是Downvoter,但问题表明没有任何效果。@LittleBobbyTables是的,我是在问doWn投票给我的答案,而不是对OP问题的否决票。@oauh-我知道,我指出有一种倾向,对低质量/不努力的问题的答案进行否决票,这就是为什么您可能会被拒绝的原因。虽然代码本身可以说明问题,但仅代码的答案不能提供足够的信息被认为是高质量的。请添加详细信息关于为什么你的代码解决了这个问题。你能不使用循环来解决这个问题吗?我在一次面试中也被问到了同样的问题。当我这样做的时候,面试官告诉我不要使用循环。
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)])