Исходный текст задания:
Напечатать столбиком пример на деление натурального числа 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. ЗАдача вроде сама по себе нетрудная, но реализация у меня получилась слитшком громоздкой, поэтому может кто подскажет более оптимальный вариант?
19 сентября 2008 в 15:01
Вот рабочая программа только на 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.
Реализовано предельно просто. Надо только с оформлением поработать…
16 сентября 2008 в 15:03
Да еще под консоль парню надо выравнить эти столбики долбанные… идиотизм какой-то.
Я-то делал целый класс для длинной арифметики с плавающей точкой, там все операторы/преобразования делал, чтобы просто использовать можно было
Bigchis a,b="3,5";
a=b/3;
String c=a; и т.д.
а не для консоли (
Сочувствую парню… такое в институте что ли?
16 сентября 2008 в 12:05
Если с башкой парень, догадается методы в функции переделать
16 сентября 2008 в 11:00
Вот фрагмент моей программы, правда числа там подразумеваются и не целые:
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 (само собой).
Если что еще не понятно, пиши в личку (на емейл)
Мля… зря писал. Язык у тебя С, а не С++. Все равно, надеюсь, что пост был полезен…
16 сентября 2008 в 7:03
Имхо, лучше массивом. Поддержка длинных чисел и вся фигня
16 сентября 2008 в 1:04
я это уже делал 2 года назад…
16 сентября 2008 в 1:00
Исходники выложу позже.
Старый вариант хуже тем, что остальные хоть както работают, а в этом какаято ошибка и прога виснет.
И пожалуйста не умничать по поводу, что деление столбиком просто – сами попробуйте если не верите
16 сентября 2008 в 0:04
а нафиг это делать через массив? поделил, получил, вывел, запомнил и с начала, до тех пор пока не закончатся циферы или не будет достигнута нужная точность, тебя же ведь не просят запоминать все промежуточные результаты…, просто сделай деление столбиком, так как делал это в школе
15 сентября 2008 в 23:02
А чем кроме громоздкости старый вариант хуже?
Покажите, пожаста, исходник =)