PDA

Просмотр полной версии : Представить число



Колядин Максим
24.12.2006, 17:35
Дано натуральное число N. Требуется представить его в виде суммы двух натуральных чисел A и B таких, что НОД (наибольший общий делитель) чисел A и B — максимален.
__
Например дано число 15, тогда A=5, B=10.
__
Напервый взгляд-то легко, но как начал писать программу, то не знал с чего начать....

Колядин Максим
24.12.2006, 22:25
Извините, поспешил с вопросом - уже сам решил. Задача была действительно лёгкой. Но меня волнует ещё один нетрудный, но, как бы это ни было удевительно, для меня неизвестный вопрос. Даже не знаю как вам его описать... Кароче, нужно чтобы элементы массива не вводить самому, а чтобы они шли в последовательном порядке (var mas: array [1..5] of integer; элементы массива - 1, 2, 3, 4, 5.).
___
Если не поняли в чём вопрос, тогда рассмотрите следующий пример:
Написать программу, которая сначала вводит 10 чисел, затем определяет сумму элементов массива и выдаёт результат на экран


program ex_1;
var m: array [1..10] of real; {декларация массива}
i: integer; {параметр цикла FOR}
s: real; {сумма}
FOR i:= 1 to 10 do begin
writeln('ВВедите элемент массива №',i);
readln(m[i]);
end;
s:=0;
FOR i:= 1 to 30 do s:=s+m[i];
writeln('Cумма элементов массива равна ',s);
readln;
END.

Сдесь нужно вводить элементы массива


....
FOR i:= 1 to 10 do begin
writeln('ВВедите элемент массива №',i);
readln(m[i]);
end;
....

А мне нужно, как я уже сказал, чтобы элементы шли в последовательном порядке (в данном случае это 1,2,3,4,5,6,7,8,9,10).
_____
Заранее благодарен...

shpi0
25.12.2006, 08:46
FOR i:= 1 to 10 do begin
m[i]:=i;
end;

Хыиуду
25.12.2006, 09:55
FOR i:= 1 to 10 do begin
m[i]:=i;
end;

Здесь можно даже без бегина и энда

shpi0
25.12.2006, 10:42
да, можно. я написал чтоб человеку по аналогии понятно было

Колядин Максим
25.12.2006, 14:36
Я так конечно же пробывал, - неполучается... почему-то. Наверное с компом проблемы..Только вот так


u:=1; j:=2;
for i:= 1 to 24 do
x[1]:=1;
while j<>24 do begin
x[1+u]:=1+u;
u:=u+1;
j:=j+1;
end;

Ну всё равно, спасибо! И ещё, вы не могли бы помоч с задачкой -
____
Старинные часы бьют каждые полчаса. Причем в начале каждого часа они бьют столько раз, сколько сейчас часов (по 1 разу – в час ночи и в час дня, по 2 раза – в два часа ночи в два часа дня и т.д., в полночь и в полдень они бьют, соответственно, по 12 раз). И еще 1 раз они бьют в середине каждого часа.
Дан промежуток времени (известно, что прошло строго меньше 24 часов). Напишите программу, определяющую, сколько ударов сделали часы за это время.

Здесь вроде тоже ничего сложного вот что начеркал (ещё не доделал);


uses crt;
var c,m,kc,km,otv,i,sum,y,u,j,r: integer;
x: array [1..24] of integer;

begin
clrscr;
writeln('Начальное время.');
read(c); gotoxy(3,2); write(':'); readln(m);
writeln('Конечное время.');
read(kc);gotoxy(3,4); write(':'); readln(km);
u:=1; j:=2;

for i:= 1 to 24 do
x[1]:=1;
while j<>24 do begin
x[1+u]:=1+u;
u:=u+1;
j:=j+1;
{the}end;

{-------------Инициализация часов-----------}
u:=1;j:=0;r:=13;


if c=0 then c:=12;
while j<>24 do begin
if c=r then c:=u;
inc(j);
inc(r);
inc(u);
end;

u:=1;j:=0;r:=13;

if kc=0 then kc:=12;
while j<>24 do begin
if kc=r then kc:=u;
inc(j);
inc(r);
inc(u);
end;
{---------------------------------------}

for i:= c to kc do begin
sum:=sum+x[i];
end;

if sum=0 then begin
for i:= c downto kc do sum:=sum+x[i];
end;


if km-m>=30 then sum:=sum+1;
writeln('Стукнуло ',sum,' раз');
readkey;
end.

Время трудно полностью инициализировать....
Вот примеры входных и выходных данных
Ввод: 5 :20
10:25
Вывод: 45
Ещё,
Ввод: 10 :25
5 :20
Вывод: 135
....Как тут полностью доделать????

Хыиуду
25.12.2006, 15:15
Задачка интересная. Главные загвоздки - 12-часовая система (или все-таки 24-часовая?) и переход через полночь. В общем, я так думаю, надо разбивать весь заданный интервал на промежутки, границами которого являются границы заданного, полдень и полночь, и просчитывать количество ударов в каждом промежутке. Подробнее сейчас времени просто нет расписывать.

somewhere
25.12.2006, 17:50
В принципе, идея такая. Будет массив из записей: в каждой есть время в минутах и число ударов на это время. Первый элемент соответствует 0:30, и далее по полчаса. Минуты записываются с учетом 24 часового времени, число ударов по формуле с учетом 12 часового. Потом вычисляем элементы массива соотв. начальному и конечному времени, которые пересекут данный интервал. Массив был удлинен в 2 раза чтобы проще считать циклическое время. Вообщем будут вопросы, пишите :-)



uses Crt;

Type
TTimeBeats = Record Time : Word;
Beat : Word;
end;

var
times : Array[1..96] of TTimeBeats;
x : Integer;
sh, sm: Integer;
eh, em: Integer;
t1, t2: Integer;
sp, ep: Integer;

begin
For x := 1 to 48 do
begin
times[x].Time := x*30;
times[x].Beat := ((x div 2)-1) mod 12 + 1;
end;
For x := 1 to 24 do times[x*2-1].Beat := 1;
move(times[1], times[49], 48*sizeof(TTimeBeats));
sh := 10; sm := 25;
eh := 5; em := 20;
t1 := sh*60 + sm;
t2 := eh*60 + em;
sp := 1;
while (t1 > times[sp].Time) do inc(sp);
ep := sp;
if t2 < t1 then ep := 49;
while (t2 > times[ep].Time) do inc(ep);
dec(ep);
t1 := 0;
for x := sp to ep do inc(t1, times[x].Beat);
Writeln('Beats : ', t1);

end.

Колядин Максим
25.12.2006, 20:14
times[x].Time := x*30;
times[x].Beat := ((x div 2)-1) mod 12 + 1;
Можно обьяснить смысл... я не пойму зачем это. И вообще, если можно, поясни ход своих действий. А за задачу - спасибо, работает на 5+...

somewhere
25.12.2006, 21:22
Начнем попорядку:


Type
TTimeBeats = Record Time : Word;
Beat : Word;
end;
Описывается структура записи, Time - время в минутах, Beat - число ударов в это время.

times : Array[1..96] of TTimeBeats; - сам массив по полчаса на 2 дня вперед
x : Integer; так, мусор всякий
sh, sm: Integer; Start hour, Start minute
eh, em: Integer; End hour, End minute
t1, t2: Integer; Time1, Time2
sp, ep: Integer; Start Position & End Position
Описание переменных


For x := 1 to 48 do
begin
times[x].Time := x*30;
times[x].Beat := ((x div 2)-1) mod 12 + 1;
end;
Первый элемент массива - это половина первого ночи, потом Time заполняется каждые 30 мин.
Немного посложнее с Beat - объясняю:
Х - это шаги, каждые полчаса - новый элемент массива. Известно, что число ударов от 1 до 12 каждый час, и по удару каждые полчаса. Т.е. каждый четный элемент - это целый час (х div 2). Время указывается в 24 часовом формате, а нам надо 12 часовой. Конструкция mod дает остаток от 0 до 11, а надо от 1 до 12 - отсюда единички.

For x := 1 to 24 do times[x*2-1].Beat := 1;
Каждые полчаса по одному удару.

move(times[1], times[49], 48*sizeof(TTimeBeats));
Дублируем массив, чтобы проще считать переходы на новые сутки.

sh := 10; sm := 25;
eh := 5; em := 20;
t1 := sh*60 + sm;
t2 := eh*60 + em;
Задаем время, переводим его в минуты

sp := 1;
while (t1 > times[sp].Time) do inc(sp);
Ищем начальную позицию в массиве после заданного момента времени, т.е. если задано 10:15 укажет на позицию элемента в массиве, соотв. 10:30

ep := sp;
if t2 < t1 then ep := 49;
while (t2 > times[ep].Time) do inc(ep);
dec(ep);
Ищем конечную позицию перед заданным моментом, если есть переход на новые сутки, то начинаем искать с позиции новых суток.

t1 := 0;
for x := sp to ep do inc(t1, times[x].Beat);
А теперь все что осталось - сложить число ударов в массиве с начальной по конечную позицию времени.

Колядин Максим
25.12.2006, 23:56
Да уж... На первый взгляд задачка-то лёгкая. Только на первый взгляд. Спасибо за подробное пояснение, после него я понял, что ты очень-очень умный, и что я очень while глупый...