Полная версия этой страницы:
Разбор решений
Цитата(Kshishtov @ 26 Apr 2006, 21:39)
Боурн, спасибо еще раз.
еще надо?(может по заказу допустим

)
Kshishtov
27 Apr 2006, 17:19
Пока нет,спасибо.Если можешь, реши ту задачку,что с типизироваными файлами.буду очень благодарен.
Kshishtov, обьясни мне одну вещчъ... тебе по твоей специльности програмирование пргодится?... бо такие вопросы простые задаешь...
Если нафик не надо, то кнечно подскажем... Но иесли нет, то имхо смому знать полезно... Почему?... Бо НАДО!!!
Kshishtov
28 Apr 2006, 17:58
Нафиг оно мне не нужно.У меня специальность техник/инженер чего-то там..Я с компами по специальности встречаться вообще не буду!Камеры там всякие, киноаппаратура - вот мое.
gamecreator
28 Apr 2006, 19:53
попробую сделать твою задачу. так, как я себе представляю.
Борн придет и перепишет на паскаль.
Код
#include<fstream.h>
void main
{
int i, n;
char mas[255][255];
ifstream fin("H1");
ofstream fout("H2");
for(n=0;fin;n++)
fin.getline(255,10,'\n');
fin.close();
fin.open("H1");
for(i=0;i<n;i++)
fin.getline(255,10,'\n');
fout<<mas[0]<<' ';
for(i=1;i<n;i++)
fout<<mas[i]<<' '<<mas[i]<<' ';
fout<<mas[0];
}
в корректности последних двух строк не уверен.
если прога под винду - размеры массива можно ставить хоть 30000х30000.
Добавлено ([mergetime]1146243187[/mergetime]):
на примере прикрепленного файла получится
1 2 3 4 2 5 6 7 8 1 5 6 7 8 1 9 10 11 12 1 9 10 11 12 1 3 3 2 2 2 3 3 2 2 2 1 2 3 4 2
Kshishtov
02 May 2006, 20:05
Боурн, глянь пожалуйста эту задачку, очень надо!!!Скоро зачетная неделя, а мне на нее без задачи этой не выйти(задача с тип-ми файлами,данная выше)
а я так по наивности думал, что типизированные файлы через пробел не пишутся...
gamecreator
08 May 2006, 20:58
Цитата(Ennin @ 06 May 2006, 11:51)
а я так по наивности думал, что типизированные файлы через пробел не пишутся...
это ты к чему?
Darth_Beleg
10 May 2006, 06:34
Для textfile:
Код
program foo(input, output);
const
N = 255;
var
a0, ai: array[1..N] of integer;
i, c0, j: integer;
begin
assign(input, 'H1'); reset(input);
assign(output, 'H2'); rewrite(output);
i := 1;
while not (seekeoln or seekeof and (i < N+1)) do
begin
read(a0[i]);
write(a0[i], ' ');
inc(i);
end;
dec(i);
if (i > N) then halt(1); {Error - out of memory}
c0 := i;
if eof then
begin
for i := 1 to c0 do
write(a0[i], ' ');
halt(0);
end;
while not seekeof do
begin
i := 1;
while not seekeoln and (i < N+1) do
begin
read(ai[i]);
write(ai[i], ' ');
inc(i);
end;
dec(i);
if (i > N) then halt(1); {Error - out of memory}
for j := 1 to i do
write(ai[j], ' ');
end;
for j := 1 to c0 do
write(a0[j], ' ');
close(output);
end.
gamecreator, типизированные файло (file of char) типа чар пишется строка. типа байт (file of byte) пишется цифрами побайтно. типа инт - по 2 байта. пробелы означают, что это #32, а не следующий элемент. etc.
darth beleg, я давненько не видал вот этакого разэтакого. помесь какая-то ужасная. или я не смыслю в паскале.
начиная c того, что параметры запуска передаются через paramstr,
c того, что read и write берут необязательным вообще, но нужным тут параметром файл, с того, что eoln и eof - это тоже функции, берущие параметром файл - и до того, что input и output - имена системные и зарезервированные
Zantetsuken
19 May 2006, 11:53
Действительно странный паскаль какой-то. Особенно меня eoln и eof смущают.
Shmatko
19 May 2006, 15:55
Эта, может дать кто прогу, которая перемножает большие числа? Потипу 237874845*38400000 ) А то мну интегера не хватает ) приходица импровизировать ) А писать лень, вдруг завалялась у кого )
gamecreator
19 May 2006, 15:59
я делал когда-то, но она потерялась

.
писать ее не трудно, трудно отлаживать.
для таких хватит и calc.exe
ЗЫ по поводу написания и отладки...
__int64 a,b,c;
a=237874845;
b=38400000;
c=a*b;
разве такое не катит?
gamecreator
19 May 2006, 16:22
а 432164943502170946947659621*4309574375638756273 сколько будет?
этого твоя прога точно не посчитает
186114316951656621266138316771191649135149781659158114141114133
Добавлено ([mergetime]1148055311[/mergetime]):

я и больше могу считать
gamecreator
19 May 2006, 20:08
написал прогу, которая считает через символьные массивы?
Kshishtov
19 May 2006, 20:18
end of line и end of file.
Я это только и знаю наверно..
угу массивы

, да там писать минут десять, из которых вспоминал как перемножить 2 числа минут 5:)
Шматко же привел примеры чисел, они вполне адекватны

а умножение размерности N гыыыы
столбик не решает

правдо отлаживать опять же не нужно... остальные алгоритмы канули в лето ... слишком давно учился.
PS кстати не согласен с ответом ... код в студию

у меня получается
1862446966566326738467820650364979660582552533
Shmatko
20 May 2006, 13:08
Эту прогу писал и сам недавно, но потерял и ессена помню что это просто геморой в плане отладки, вот и спросил - може есть у кого, а то лень писать заново было )
ЗЫ: тока мне нужна была прога на ПАСКАЛЕ ) Думал из названия темы будет понятно ) Точнее фрагмент проги
Danilych
20 May 2006, 13:41
Мы это делали через строки и перевод их посимвольно в числа.

Правда это было сложение но алгоритмы схожи.
ну переведи в паскаль

два вложенных цикла и 5 действий думаю понятны гыыы
PS убей бог не понимаю в чем геморой то при отладке? хотя паскаль как средство отладки тоже не понимаю
Shmatko
20 May 2006, 18:49
Цитата(orgus @ 20 May 2006, 14:19)
ну переведи в паскаль

два вложенных цикла и 5 действий думаю понятны гыыы
PS убей бог не понимаю в чем геморой то при отладке? хотя паскаль как средство отладки тоже не понимаю

Ну кто то пишет сразу прально, тк шарит в программировании, я же пишу так, что пожизни приходица отлаживать )
ЗЫ: кто не понял - я шарю в паскале довольно посредственно )
ЗЗЫ: нифига мне там не понятно, я даж нинаю на каком там языке написано ) Я же не программист блин )
Цитата(orgus @ 19 May 2006, 21:51)
PS кстати не согласен с ответом ... код в студию

у меня получается
1862446966566326738467820650364979660582552533
может быть, я проверку не делал
ну я тем более паскаль не помню

... извиняй
gamecreator
20 May 2006, 20:44
оргус прав. это 46-значное число.
1862446966566326738467820650364979660582552533
Добавлено ([mergetime]1148148094[/mergetime]):
вот надо было проверку в конец забацать
BreakMaster
20 May 2006, 21:40
Цитата(Bourn @ 20 May 2006, 21:03)
Цитата(orgus @ 19 May 2006, 21:51)
PS кстати не согласен с ответом ... код в студию

у меня получается
1862446966566326738467820650364979660582552533
может быть, я проверку не делал

А проверка выполняется ручкой и бумагой?
Цитата(BreakMaster @ 20 May 2006, 22:40)
А проверка выполняется ручкой и бумагой?

ну несовсем
а че проверять... кол-во знаков это сумма разрядов ну мэйби + 1 ... а правильность... ну можно перемножить на калькуляторе концевики этак разрядов 5-6 и посмотреть совпало ли.
Felis Ferus
21 May 2006, 00:14
да можно и полный... неужели ни у кого нет научного калькулятора?
Цитата(orgus @ 21 May 2006, 00:36)
а че проверять... кол-во знаков это сумма разрядов ну мэйби + 1 ... а правильность... ну можно перемножить на калькуляторе концевики этак разрядов 5-6 и посмотреть совпало ли.
не кол-во знаков, проверять какое число записано в массив, если больше 10 то соответственно осуществляем преобразования...и тп
я тоже не делал.... скорость вычисления один фиг приемлима, так что почему бы и не делать перенос постоянно

в случае < 10 перенесется 0...
Darth_Beleg
21 May 2006, 14:55
А зачем делать перенос постоянно, если достаточно только один раз???
ваш вариант кода в студию

пока я вижу тока свой
а то не понятен вопрос.
Необходимость переноса возникает при операции умножения или сложения... проверка делать перенос или не делать не актуальна если оптимизация не нужна. Что значит "достаточно только один раз"?

покажите где в коде убрать чаго нить лишнее
вот мой код
Код
Private Sub Command1_Click()
Dim first() As Byte
Dim second() As Byte
Dim third() As Byte
Dim s1 As String
Dim s2 As String
Dim s3 As String
s1 = Trim(Text1.Text)
s2 = Trim(Text2.Text)
If Len(s1) > Len(s2) Then
m = Len(s1)
s2 = String(m - Len(s2), 48) + s2
Else
m = Len(s2)
s1 = String(m - Len(s1), 48) + s1
End If
ReDim first(1 To m), second(1 To m)
n = m
For x = 1 To m
first(x) = Val(Mid(s1, n, 1))
second(x) = Val(Mid(s2, n, 1))
n = n - 1
Next x
n = 1
ReDim third(1 To 2 * m)
For x = 1 To m
For y = 0 To m - 1
third(x + y) = third(x + y) + (first(x) * second(y + 1)) Mod 10
third(x + y + 1) = third(x + y + 1) + (first(x) * second(y + 1)) \ 10
If third(x + y) > 9 Then h = third(x + y): third(x + y) = h Mod 10: third(x + y + 1) = third(x + y + 1) + h \ 10
Next y
Next x
s3 = ""
For x = 1 To UBound(third())
s3 = Trim(Str(third(x))) + s3
Next x
Do While Mid(s3, 1, 1) = "0"
s3 = Right(s3, Len(s3) - 1)
Loop
Text3.Text = s3
End Sub
в Text1.Text и Text2.Text перемножаемые числа в Text3.Text результат
ну тоже самое "If third(x + y) > 9 Then" если убрать ни чего страшного не будет если конечно бэйсик целочисленно делит а не округляет. А так код напоминает мой, разве что синтаксис глаза режет

Осталось найти того кто подобное на паскаль переведет для Шматко, если тот и бэйсика не знает
Цитата(orgus @ 21 May 2006, 18:26)
ну тоже самое "If third(x + y) > 9 Then" если убрать ни чего страшного не будет если конечно бэйсик целочисленно делит а не округляет.
всмысле ниче страшного не будет? будет тк допустим в одной ячейке будет число 15(от произведения 3*5) а в другой 3(те мы перемножали 15 и 3) и выйдет 315 вместо 45
Darth_Beleg
22 May 2006, 11:31
Код
program long_mult;
const MAX = 100;
type MyArray = array[1..MAX] of integer;
var
a,b: MyArray;
la, lb: integer;
c: array[1..2*MAX+1] of integer;
i,j,k: integer;
procedure readnum(var m: MyArray; var l: integer);
var
ch: char;
i, t: integer;
begin
while not (ch in ['0'..'9']) do
read(ch);
while ch in ['0'..'9'] do
begin
inc(l);
m[l] := byte(ch)-48;
read(ch);
end;
readln;
for i := 1 to l div 2 do
begin
t := m[i];
m[i] := m[l-i+1];
m[l-i+1] := t;
end;
end;
begin
{Input}
assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);
readnum(a, la); readnum(b, lb);
{Multiplication}
for i := 1 to la do
for j := 1 to lb do
inc(c[i+j-1], a[i]*b[j]);
{Normalize - one time}
for i := 1 to 2*MAX do
begin
inc(c[i+1], c[i] div 10);
c[i] := c[i] mod 10;
end;
{High-order digit and output}
for k := 2*MAX+1 downto 2 do
if c[k] > 0 then break;
for i := k downto 1 do
write(c[i]);
writeln;
close(output);
end.
Предполагаем, что числа в файле записаны по одному в строке.
Shmatko
22 May 2006, 14:49
О, сэнкс!
/*исправляюсь*/ решение верное обжалованию не подлежит ..
Добавлено ([mergetime]1148452518[/mergetime]):
Цитата(Bourn @ 21 May 2006, 17:58)
Цитата(orgus @ 21 May 2006, 18:26)
ну тоже самое "If third(x + y) > 9 Then" если убрать ни чего страшного не будет если конечно бэйсик целочисленно делит а не округляет.
всмысле ниче страшного не будет? будет тк допустим в одной ячейке будет число 15(от произведения 3*5) а в другой 3(те мы перемножали 15 и 3) и выйдет 315 вместо 45
не... убрать сам if оставив действие. При умножении ты же не проверяешь было ли число больше 9... просто оставляешь остаток а целую часть переносишь, точно так же можешь не проверять и потом.
PS позно отвечаю, приболел
Darth_Beleg
24 May 2006, 16:01
Цитата
лень паскаль ставить, что будет если число после сумирования "inc(c[i+j-1], a[ i ]*b[j])" превысит 99 ? странно смотрится последующяя попытка нормирования по модулю 10. Не берусь утверждать но на первый взгляд не верное решение.
Диапазон типа integer вообще-то до 32767 в досовском паскале и до 2147483647 в Delphi. Так что ничего не случится.
Нормализация - это наш нижегородский жаргонизм, по-видимому.
Решение проверено тремя поколениями олимпиадников.
не диапазон тут не при чем, решение верное. Непонимание вызвало то что допускаете ситуацию когда число перескакивает за приделы сотни и после div 10 получаем число > 9 (когда столбиком перемножаем на бумаге так не делаем), но это не страшно так как остаток от деления же остается а остальное потом все равно будет обработано, болею соображаю туго

гы у вас олимпиадники три поколения подряд одно и тоже пишут? (шутююю, просто задача не для олимпиад)
PS у меня и у Bourn столбик реализован так как будто его делают по всем правилам

эт от того что пришлось вспоминать что это такое.
Darth_Beleg
25 May 2006, 22:35
Просто задача иногда в комбинаторных числах выплывает - а хороший код учится наизусть. Тем более, что и в чистом виде встречал.
Впрочем, вологодские олимпиадники пишут как вы (судя по книге Ф. Меньшикова) - я даже удивился.
я на олимпиадах не был ... эээээ ... ну лет 10:) ездил конечно, правдо было сложно что либо выйграть так как тяжеловато писать олимпиадные задачи зная лишь dbase3 Карат и Клипер

учитель у нас был разработчиком баз данных... хотя теорию не плохо преподал. Да и образование подводило... забавно было сидеть и прямо на олимпиаде разбираться что же такое польская запись ибо в нашей школе такого как то не преподавали.
izrukvruki
11 Jul 2006, 15:59
Мне нужна помощь. Нужна программка на Паскале:
Есть построковый файл rasklad.txt
12345566 12 76
32211233 3 6
55443323 5 76
77675655 4 98
44333221 7 76
....
44333221 5 87
12345566 54 65
(структура такая: сначало восьмизначное число, пробел, короткое число (1-3 знака), пробел, короткое число (1-3 знака)
нужно проверить наличие двойных восьмизначных первых чисел и получить в результате файл error.txt
Дубли:
12345566 12 76 и 12345566 54 65
44333221 7 76 и 44333221 5 87
Спасибо за вникание
sergroj
13 Jul 2006, 09:37
Это тебе для себя или на проверку? Алгоритм попроще или пооптимальнее? А если дублей больше 2 че делать?
izrukvruki
13 Jul 2006, 13:37
Для себя. Алгоритм какой полегче реализовать. Ну пуст допишет в строку третий набор, т.е.
12345566 12 76 и 12345566 54 65 и 12345566 5 89
Первая восьмизначная цифра это наименование объекта (номер рекламного макета), вторые две ее координаты (рубрика и подрубрика, или страница и колонка), (на самом деле после восьмизначной цифры может стоять все что угодно, эти значения учитывать не надо, но привязку к восьмизначной цифры обязательно оставлять надо). Нельзя чтоб на плоскости было два одинаковых объекта в разных местах, это приводит к ошибке работы одной программы, которой я ежедневно пользуюсь. Исходный файл имеет около 8000 строк. Двойные объекты это конечно редкость, но все же иногда попадаются.
Rask.txt
a1 b1
a2 b2
....
a6000 b6000
(где ai возьмизначная цифра (может начинаться с нулей, 00005654), bi - строка.)
если ai=aj и aj=ak
то в файл error.txt записать
Дубли:
ai bi и aj bj и ak bk
sergroj
13 Jul 2006, 18:44
А Дельфи не подойдет? (по синтаксису есть мелкие расширения, я делать в нем буду, потом подправлю/ишь если че)
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.