2013-03-02 4 views
0

Im пытается сделать функцию, которая делает разделение с вне/символC++ функция преформ деление

long q(int nm1, int nm2) 
{ 
    long q = 0; 

    while (num1 > num2) 
    { 
    some subtraction here  
    } 
return q; 

} 

идея заключается в том, чтобы предположить, вход в порядке, и первый должен быть разделен на второй. Это означает, что вычесть второе из первого, пока второе меньше первого числа.

Я пробовал много разных способов сделать это, но по какой-то причине я не могу его ударить.

Сейчас я предполагаю, что число положительно и не возвратит деление на ноль (я могу исправить это позже, вызвав мои другие функции)

+1

Ну, как вы показать нам один из «многих различных способов» вы пытались, возможно, тот, который, по вашему мнению, ближе всего? Это не проблема программирования, вам просто нужно знать, как это сделать на листе бумаги, а затем перевести его в код. – us2012

+0

Трудно разделить без оператора. И с вычитанием вы сможете сделать, только если число отлично делится. Но я буду думать об этом, тем не менее !!!!!! – IcyFlame

+0

Да. Я думаю, вы должны передать вопрос математике. – IcyFlame

ответ

3

Это означает, вычесть второе из первого до второго не меньше первого числа.

И в чем проблема?

int div(int num, int den) 
{ 
    int frac; 
    for (frac = 0; num >= den; num -= den, frac++) 
     ; 

    return frac; 
} 
+0

Здесь вы получите только целую часть ответа. Не десятичная часть. Как вы планируете справиться с этим? – IcyFlame

+0

Вам нужно обработать деление на 0 и отрицательные числа, но основная идея звучит. – Antimony

+1

@icyflame Ни в коем случае. Целочисленное деление усекает. (Пойдите, возьмите некоторое общее чувство C, прежде чем соблазнять других ...) – 2013-03-02 06:31:52

0

Просто улучшите приведенный выше ответ немного. Используйте модуль

long div(int num, int den) 
{ 
    int frac; 
    int num2 = num; 

    for (frac = 0; num2 >= den; num2 -= den, frac++) 
     ; 
// i needed the original num and den. 

    return ((long) frac)+(num % den); 

// casts frac to long then adds the modulus remainder of the values. 
} 
+0

это помогает? – JWW

+1

Нет. Это (а) неверно и (б) если у вас было назначение для реализации деления без '/', то '%' также не было бы разрешено. – us2012

1

Что вы оригинальный пост пытается сделать это Отдел многократным алгоритма вычитания. Посмотрите Wikipedia:

Самый простой алгоритм деления, исторически объединены в наибольший алгоритм общий делитель, представленный в Евклида, Книга VII, предложение 1, находит остаток дал два положительных целых чисел с использованием только вычитаний и сравнения

while N ≥ D do 
    N := N - D 
end 
return N 

Просто добавьте счетчик в цикле в то время, чтобы следить за количеством итераций (что вы хотите вернуться) и после того, как ваш цикл N будет содержать remaind er (если это не 0, конечно).

1

Этот код будет работать только в том случае, если num и den являются целыми.

int main(int num, int den) 
    { 
     if(den==0) 
     { 
      return 1; 
     } 
     else 
     { 
      while(num!=0) 
      { 
       num = num - den;  
      } 
     } 
     return 0;   
    } 
0

только немного оптимизации: вы не хотите, чтобы иметь линейную временную сложность со значением входного

int div(int num, int den) 
{ 
    int result = 0; 
    int i; 
    long long x; 
    long long y; 
    if (num < 0) return -div(-num, den); 
    if (den < 0) return -div(num, den); 
    if (num < den) return 0; 

    x = num; 
    y = den; 
    i = 0; 
    while((i < 32) && (x > (y << (i+1)))) i++; 
    for(;i>0; i++) 
    { 
     if (x > (y << i)) 
     { 
      x -= y; 
      result += 1 << i; 
     } 
    } 

    return result; 
} 
Смежные вопросы