singlepost

Задача. Решить пример на деление столбиком. Язык С << На главную или назад  

Исходный текст задания:

Напечатать столбиком пример на деление натурального числа k на натуральное l (k делится на l нацело).

Как пытался решить:

1)Подсчитывается колво цифр у делимого и делителя. Делимое разбивается на ходу (все промежуточные числа нигде не хранятся) на левую и правую часть. Левая часть – минимальное число составленное из цифр слева, но чтобы оно делилось на делитель. Далее чтото выводится на экран, а к правой части дописывается слева остаток от деления левой части на делитель, у полученных таким образом чисел после каждого прохода записывается количество цифр.
Например:
Делимое 765, делитель 5.
Первый проход. 7 – левая часть, 65 правая, 7%5=2. Получим число 265 и т.д пока не закончатся цифры.

2)От частного отделяем по одной цифре слева. Допустим, делимое 765, делитель 5, частное 113. берем самую левую единицу – вначале отделяем ее путем деления на 10 и запоминаем, потом столько же раз, сколько делили на 10 умножаем на 10 – получаем в примере 100. Это число домножаем на делитель (в даннгом случае 5) и вычитаем из делимого. Промежуточные числа также нигде не хранятся.

3)Разбиваем делимое и частное на цифры и заводим на них массив – таким образом промежуточные результаты сохраняются и можно получить к ним доступ в любое время. Причем с делимым я поступаю также как и в предыдущих двух случаях, а для частного еще один массив – цифры, но с учетом их разряда. Например, для числа 113 один массив {1,1,3}, второй {100,10,3}.

Ни один из трех способов не доведен до конца из-за ошибок в реализации. Основной вопрос в оформлении максимально приближенном к реальному. Без подчеркиваний можно обойтись, а вот как сделать правильное количество пробелов? И не придумал пока, как учесть, что после каждого прохода на следующую строчку сносится остаток от деления.

P.S. ЗАдача вроде сама по себе нетрудная, но реализация у меня получилась слитшком громоздкой, поэтому может кто подскажет более оптимальный вариант?

42 ответов в теме “Задача. Решить пример на деление столбиком. Язык С”

  1. 9
    Александр Тамбовский ответил:

    Вот рабочая программа только на Pascal-е:

    Program DELENIE;
    uses CRT;
    var X,Y,res,ost,ch: string;
    lx,ly: byte;
    dx,dy,dr,Code:integer;
    function Srav(X,Y:string):byte;
    var i:byte;
    begin
    if lx<ly then begin Srav:=1; exit; end
    else Srav:=0;
    for i:=1 to ly do begin
    if X[i]>Y[i] thenbegin Srav:=0; break; end
    else if X[i]<Y[i] thenbegin Srav:=1; break; end
    end
    end;
    begin
    clrscr;
    write('Enter X = '); readln(X);
    write('Enter Y = '); readln(Y);
    ly:=length(Y); lx:=length(X); res:='';
    While (Srav(X,Y)=0)or(lx>ly) dobegin
    Val(Copy(X,1,ly+Srav(X,Y)),dx,Code);
    Delete(X,1,ly+Srav(X,Y));
    Val(Y,dy,Code);
    Str(dx div dy,ch);
    res:=res+ch;
    Str(dx mod dy,ost);
    X:=ost+X;
    WriteLN(X);
    lx:=length(X);
    end;
    writeln('result = '+res);
    write('Press ENTER to quit');
    readln;
    end.

    Реализовано предельно просто. Надо только с оформлением поработать…

  2. 8
    Владимир Смирнов ответил:

    Да еще под консоль парню надо :) выравнить эти столбики долбанные… идиотизм какой-то.
    Я-то делал целый класс для длинной арифметики с плавающей точкой, там все операторы/преобразования делал, чтобы просто использовать можно было
    Bigchis a,b="3,5";
    a=b/3;
    String c=a; и т.д.
    а не для консоли :( (
    Сочувствую парню… такое в институте что ли? ;-)

  3. 7
    Кирилл Быков ответил:

    Если с башкой парень, догадается методы в функции переделать :)

  4. 6
    Владимир Смирнов ответил:

    Вот фрагмент моей программы, правда числа там подразумеваются и не целые:
    for (i=0;i<SZ;i++)
    {
    for (j=1;j<=rt.syst,vich=trai,trai=del*j,trai<=ost;j++);
    rt.vvod(j-1);
    while (vich>ost) {–vich.exp;–rt.exp;}
    if (j!=1) ost=ost-vich ;
    if (ost.nul) break;
    while (ost<del) ost.exp++;
    }

    rt – объект результата.
    vvod()-добавление (дописывание) цифры (может быть 0!) к результату.
    ost – остаток (делимое)
    del- делитель
    Эти переменные – объекты того же класса, что и rt. (Bigchis у меня)
    В классе перегружены операторы + – * = и подобные. (это фрагмент из деления)
    SZ – максимальный размер массива (не обяз. констатна).
    ost.nul – проверяем на нуль (у меня метод).
    exp – поле объекта, експонента типа (порядок),
    например 1234 храниться как 1 2 3 4 exp:3
    1,234 как 1 2 3 4 exp:0

    Ну вот и все детали реализации :)

    Чуть не забыл: перед циклом мы приводим экспоненту делимого и делителя к 0, смещая порядок результата. Учитываем знак и деление на 0 (само собой).
    Если что еще не понятно, пиши в личку (на емейл)

    Мля… зря писал. Язык у тебя С, а не С++. Все равно, надеюсь, что пост был полезен…

  5. 5
    Кирилл Быков ответил:

    Имхо, лучше массивом. Поддержка длинных чисел и вся фигня :)

  6. 4
    Dele Ted ответил:

    я это уже делал 2 года назад…

  7. 3
    Slava Gerchicov ответил:

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

  8. 2
    Dele Ted ответил:

    а нафиг это делать через массив? поделил, получил, вывел, запомнил и с начала, до тех пор пока не закончатся циферы или не будет достигнута нужная точность, тебя же ведь не просят запоминать все промежуточные результаты…, просто сделай деление столбиком, так как делал это в школе

  9. 1
    Евгений Гаврин ответил:

    А чем кроме громоздкости старый вариант хуже?
    Покажите, пожаста, исходник =)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.