Дано натуральное число N. Требуется представить его в виде суммы двух натуральных чисел A и B таких, что НОД (наибольший общий делитель) чисел A и B — максимален.
__
Например дано число 15, тогда A=5, B=10.
__
Напервый взгляд-то легко, но как начал писать программу, то не знал с чего начать....
Представить число
Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill
- Колядин Максим
- Сообщения: 285
- Зарегистрирован: 16 ноя 2006, 19:09
- Откуда: Seattle, WA
- Контактная информация:
- Колядин Максим
- Сообщения: 285
- Зарегистрирован: 16 ноя 2006, 19:09
- Откуда: Seattle, WA
- Контактная информация:
Извините, поспешил с вопросом - уже сам решил. Задача была действительно лёгкой. Но меня волнует ещё один нетрудный, но, как бы это ни было удевительно, для меня неизвестный вопрос. Даже не знаю как вам его описать... Кароче, нужно чтобы элементы массива не вводить самому, а чтобы они шли в последовательном порядке (var mas: array [1..5] of integer; элементы массива - 1, 2, 3, 4, 5.).
___
Если не поняли в чём вопрос, тогда рассмотрите следующий пример:
[C]Написать программу, которая сначала вводит 10 чисел, затем определяет сумму элементов массива и выдаёт результат на экран[/C]
Сдесь нужно вводить элементы массива
А мне нужно, как я уже сказал, чтобы элементы шли в последовательном порядке (в данном случае это 1,2,3,4,5,6,7,8,9,10).
_____
Заранее благодарен...
___
Если не поняли в чём вопрос, тогда рассмотрите следующий пример:
[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;
....
_____
Заранее благодарен...
Код: Выделить всё
FOR i:= 1 to 10 do begin
m[i]:=i;
end;
Даже самое длинное путешествие начинается с первого шага.
Здесь можно даже без бегина и эндаshpi0 писал(а):Код: Выделить всё
FOR i:= 1 to 10 do begin m[i]:=i; end;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
да, можно. я написал чтоб человеку по аналогии понятно было
Даже самое длинное путешествие начинается с первого шага.
- Колядин Максим
- Сообщения: 285
- Зарегистрирован: 16 ноя 2006, 19:09
- Откуда: Seattle, WA
- Контактная информация:
Я так конечно же пробывал, - неполучается... почему-то. Наверное с компом проблемы..Только вот так
Ну всё равно, спасибо! И ещё, вы не могли бы помоч с задачкой -
____
Старинные часы бьют каждые полчаса. Причем в начале каждого часа они бьют столько раз, сколько сейчас часов (по 1 разу – в час ночи и в час дня, по 2 раза – в два часа ночи в два часа дня и т.д., в полночь и в полдень они бьют, соответственно, по 12 раз). И еще 1 раз они бьют в середине каждого часа.
Дан промежуток времени (известно, что прошло строго меньше 24 часов). Напишите программу, определяющую, сколько ударов сделали часы за это время.
Здесь вроде тоже ничего сложного вот что начеркал (ещё не доделал);
Время трудно полностью инициализировать....
Вот примеры входных и выходных данных
Ввод: 5 :20
10:25
Вывод: 45
Ещё,
Ввод: 10 :25
5 :20
Вывод: 135
....Как тут полностью доделать????
Код: Выделить всё
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
....Как тут полностью доделать????
Задачка интересная. Главные загвоздки - 12-часовая система (или все-таки 24-часовая?) и переход через полночь. В общем, я так думаю, надо разбивать весь заданный интервал на промежутки, границами которого являются границы заданного, полдень и полночь, и просчитывать количество ударов в каждом промежутке. Подробнее сейчас времени просто нет расписывать.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
В принципе, идея такая. Будет массив из записей: в каждой есть время в минутах и число ударов на это время. Первый элемент соответствует 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
- Контактная информация:
Можно обьяснить смысл... я не пойму зачем это. И вообще, если можно, поясни ход своих действий. А за задачу - спасибо, работает на 5+...times[x].Time := x*30;
times[x].Beat := ((x div 2)-1) mod 12 + 1;
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Начнем попорядку:
Немного посложнее с Beat - объясняю:
Х - это шаги, каждые полчаса - новый элемент массива. Известно, что число ударов от 1 до 12 каждый час, и по удару каждые полчаса. Т.е. каждый четный элемент - это целый час (х div 2). Время указывается в 24 часовом формате, а нам надо 12 часовой. Конструкция mod дает остаток от 0 до 11, а надо от 1 до 12 - отсюда единички.
Описывается структура записи, Time - время в минутах, Beat - число ударов в это время." писал(а):Type
TTimeBeats = Record Time : Word;
Beat : Word;
end;
Описание переменных" писал(а):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
Первый элемент массива - это половина первого ночи, потом Time заполняется каждые 30 мин." писал(а):For x := 1 to 48 do
begin
times[x].Time := x*30;
times[x].Beat := ((x div 2)-1) mod 12 + 1;
end;
Немного посложнее с 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;
Ищем начальную позицию в массиве после заданного момента времени, т.е. если задано 10:15 укажет на позицию элемента в массиве, соотв. 10:30" писал(а):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);
It's a long way to the top if you wanna rock'n'roll