2014-01-12 297 views
5

如何在不使用這些運算符的情況下用未知數字劃分數字('*', '/', '%')。分母在運行時給出。在不使用除法運算符的情況下劃分一個數字c

+0

浮子或INT?有符號還是無符號?你什麼時候卡住了?爲什麼? –

+0

'n = n >> 1;'.. – Maroun

+0

向我們展示一些代碼並告訴我們您卡在哪裏。這不是「幫助你做家庭作業」網站。 –

回答

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

你正在使用'-'操作符... –

+0

@ V-X對不起,但它使用+或 - 運算符很好。我實際上是在不使用'/'和'%'運算符的情況下進行編碼。 – nomorequestions

+0

您還需要檢查參數是否爲負值/正值。 –

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); 
+0

Downvoter,小心解釋你的downvote?調用這些函數是否使用任何禁止的操作符? – ouah

+0

不是downvoter,但問題顯示沒有努力。 – LittleBobbyTables

+0

@LittleBobbyTables是的,我問的是我的答案downvote,而不是OP問題的downvotes。 – ouah

0

你的問題很模糊, 但我可以給你分了許多與2的特殊情況它可以通過位移操作將數字移到右邊來執行。這是優化強度的一種形式。

例如,1101000二進制(十進制數104),向右移一位,爲0110100(十進制數52):最低位位a 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); 
} 
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); 

}

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); 
} 
13
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(); 
} 
+5

儘管代碼本身可以說明問題,但僅有代碼的答案不能提供足夠的信息以被視爲高質量。請添加關於您的代碼爲何解決問題的詳細信息。 –

+0

你可以做到這一點,而不使用循環?在採訪中我被問到了同樣的問題。當我這樣做時,面試官告訴我不要循環做。 –

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; 
} 
0
由恆定

n_bits在python

的僞代碼分=輸入的位數超過預計哪個部門是準確的

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)]) 

乘法可以用移位來實現的,並增加了

相關問題