Представить число

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, dr.Jekill, MOTOCoder, Medved

Аватара пользователя
Колядин Максим
Сообщения: 285
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

24 дек 2006, 17:35

Дано натуральное число N. Требуется представить его в виде суммы двух натуральных чисел A и B таких, что НОД (наибольший общий делитель) чисел A и B — максимален.
__
Например дано число 15, тогда A=5, B=10.
__
Напервый взгляд-то легко, но как начал писать программу, то не знал с чего начать....
Аватара пользователя
Колядин Максим
Сообщения: 285
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

24 дек 2006, 22:25

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

Код: Выделить всё

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
Сообщения: 53
Зарегистрирован: 29 сен 2004, 16:14
Откуда: оттуда
Контактная информация:

25 дек 2006, 08:46

Код: Выделить всё

FOR i:= 1 to 10 do begin
 m[i]:=i;
end;
Даже самое длинное путешествие начинается с первого шага.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

25 дек 2006, 09:55

shpi0 писал(а):

Код: Выделить всё

FOR i:= 1 to 10 do begin
 m[i]:=i;
end;
Здесь можно даже без бегина и энда
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
shpi0
Сообщения: 53
Зарегистрирован: 29 сен 2004, 16:14
Откуда: оттуда
Контактная информация:

25 дек 2006, 10:42

да, можно. я написал чтоб человеку по аналогии понятно было
Даже самое длинное путешествие начинается с первого шага.
Аватара пользователя
Колядин Максим
Сообщения: 285
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

25 дек 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
....Как тут полностью доделать????
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

25 дек 2006, 15:15

Задачка интересная. Главные загвоздки - 12-часовая система (или все-таки 24-часовая?) и переход через полночь. В общем, я так думаю, надо разбивать весь заданный интервал на промежутки, границами которого являются границы заданного, полдень и полночь, и просчитывать количество ударов в каждом промежутке. Подробнее сейчас времени просто нет расписывать.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

25 дек 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.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Колядин Максим
Сообщения: 285
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

25 дек 2006, 20:14

times[x].Time := x*30;
times[x].Beat := ((x div 2)-1) mod 12 + 1;
Можно обьяснить смысл... я не пойму зачем это. И вообще, если можно, поясни ход своих действий. А за задачу - спасибо, работает на 5+...
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

25 дек 2006, 21:22

Начнем попорядку:
&quot писал(а):Type
TTimeBeats = Record Time : Word;
Beat : Word;
end;
Описывается структура записи, Time - время в минутах, Beat - число ударов в это время.
&quot писал(а):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
Описание переменных
&quot писал(а):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 - отсюда единички.
&quot писал(а):For x := 1 to 24 do times[x*2-1].Beat := 1;
Каждые полчаса по одному удару.
&quot писал(а):move(times[1], times[49], 48*sizeof(TTimeBeats));
Дублируем массив, чтобы проще считать переходы на новые сутки.
&quot писал(а):sh := 10; sm := 25;
eh := 5; em := 20;
t1 := sh*60 + sm;
t2 := eh*60 + em;
Задаем время, переводим его в минуты
&quot писал(а):sp := 1;
while (t1 > times[sp].Time) do inc(sp);
Ищем начальную позицию в массиве после заданного момента времени, т.е. если задано 10:15 укажет на позицию элемента в массиве, соотв. 10:30
&quot писал(а):ep := sp;
if t2 < t1 then ep := 49;
while (t2 > times[ep].Time) do inc(ep);
dec(ep);
Ищем конечную позицию перед заданным моментом, если есть переход на новые сутки, то начинаем искать с позиции новых суток.
&quot писал(а):t1 := 0;
for x := sp to ep do inc(t1, times[x].Beat);
А теперь все что осталось - сложить число ударов в массиве с начальной по конечную позицию времени.
It's a long way to the top if you wanna rock'n'roll
Ответить