Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Помогите разобраться (http://www.tehnari.ru/f43/t69693/)

Kazelina 25.02.2012 18:37

Помогите разобраться
 
Я только начала разбираться в программировании. Так что не судите строго. Дана такая задача.
Дано натуральное число N. Необходимо разложить его на простые множители.
Формат входных данных
Во входном файле записано число N (2 \le N \le 100000).
Формат выходных данных
В выходной файл выведите искомые простые множители в порядке возрастания.
Примеры:
Вход
12
Выход
2 2 3
Вход
1030
Выход
2 5 103
Вот мое решение. Я уверена, что здесь есть недочеты. Помогите исправить.
var
m, n, i :integer;
f,g:text;
Begin
assign(f,'input.txt');
assign(g,'output.txt');
reset(f);
rewrite(g);
readln(f,n);
i:=2;
m:=n;
while(i<=n) do begin
if m mod i = 0 then begin
write(g,i);
m:=m div i;
end
else
inc(i);
end;
close(f);
close(g);
End.

Vladimir_S 25.02.2012 19:19

Цитата:

Сообщение от Kazelina (Сообщение 689093)
Вот мое решение. Я уверена, что здесь есть недочеты. Помогите исправить.

Мне кажется - всё правильно. Очень остроумное решение. Единственная ма-а-аленькая поправка: вместо
write(g,i);
следует написать
write(g,i,' ');
то есть после каждого записанного в выходной файл числа ставить пробел, чтобы множители не сливались.
А вообще, если сами придумали - умница! Я бы начал с того, чтобы каким-нибудь решетом Эратосфена либо еще как-нибудь составил массив простых чисел, не превышающих половину исходного, а затем проверял бы на делимость. А у Вас - ну просто красотища, а не решение! Браво!
Единственно только еще замечание. Каким Паскалем Вы пользуетесь? Если ABC, то всё правильно, а вот если Turbo, Borland или Free, то для m и n формат Integer не подходит, нужно LongInt, раз уж диапазон доходит до 100000 (в Integer верхний предел - 32000 с копейками).

Kazelina 25.02.2012 21:03

Спасибо, что уделили внимание Владимир. Поправку вашу учла, спасибо, что подсказали. Я пользуюсь Паскалем ABC.

У меня еще один вопрос. Опять задачка дана.
Дано натуральное число N. Определить, является ли оно квадратом простого числа.
Формат входных данных
Во входном файле записано N (N <= 100000).
Формат выходных данных
Вывести в выходной файл Yes, если N - квадрат простого и No в обратном случае.
Примеры:
Вход
2
Выход
No
Вход
9
Выход
Yes


Вот моя программа.
var n:integer;b:real;
f,g:text;
Begin
assign(f,'input.txt');
assign(g,'output.txt');
reset(f);
rewrite(g);
readln(f,n);
if (n>=0) then
begin
b:=sqrt(n);
if (b-Round(b)=0) then
write(g,'Yes')
else write(g,'No');
end
else
write(g,'No');
close(f);
close(g);
End.

Здесь что-то опять не так. А что не могу понять. Буду признательна.

Vladimir_S 25.02.2012 21:45

Цитата:

Сообщение от Kazelina (Сообщение 689244)
Здесь что-то опять не так. А что не могу понять. Буду признательна.

Ну, прежде всего, "не так" то, что Вы решаете не совсем ту задачу, а точнее задачу, существенно упрощенную: вместо проверки на то, что корень является простым числом, Вы делаете проверку на то, что он является числом целым.

Kazelina 25.02.2012 23:39

Цитата:

Сообщение от Vladimir_S (Сообщение 689330)
вместо проверки на то, что корень является простым числом, Вы делаете проверку на то, что он является числом целым.

Аааа, ну да же простым, я что-то запуталась, уже с этими задачами.

А как же исправить?

Vladimir_S 26.02.2012 10:35

Цитата:

Сообщение от Kazelina (Сообщение 689499)
А как же исправить?

Например, так:
Код:

var
 n,i,m:integer;
 b:real;
 f,g:text;
Begin
 assign(f,'input.txt');
 assign(g,'output.txt');
 reset(f);
 rewrite(g);
 readln(f,n);
 if (n>3) then
  begin
  b:=sqrt(n);
  if (b-Round(b)=0) then
    begin
    i:=1;
    repeat
      Inc(i);
      m:=Round(b) mod i;
    until m=0;
    If i=Round(b) then write(g,'Yes')
    else write(g,'No');
    end
  else write(g,'No');
  end
 else
  write(g,'No');
 close(f);
 close(g);
End.

Обратите внимание на изменение первого условия: вместо
if (n>=0) then
поставлено
if (n>3) then
Это важно: иначе при вводе 1, 2 или 3 возникнет ошибка зацикливания.

Kazelina 26.02.2012 18:15

Спасибо еще раз. Разобралась я в задаче. Теперь всё правильно.

Вчера вечером сидела голову ломала еще над одной задачей. Рекуррентные соотношения. Вроде простая задача, но что-то опять не правильно.

На каждом следующем дне рождения Винни Пух съедает столько же меда, что и на двух предыдущих. На двух первых днях рождения у Пяточка и у Кролика он съел по 100 г меда. Написать программу, определяющую, сколько килограммов меда съест Винни Пух на N-ом дне рождения.
Формат входных данных
Во входном файле задано единственное число N (1 \le N \le 40).
Формат выходных данных
Выведите, сколько килограммов меда съест Винни Пух на этот день рождения с точностью до одного знака после десятичной точки.
Примеры:
Вход
1
Выход
0.1
Вход
4
Выход
0.3

Вот мое решение.
var a, b, c, k:real;
n,d:integer;
f,g:text;
Begin
assign(f,'input.txt');
assign(g,'output.txt');
reset(f);
rewrite(g);
readln(f,n);
a:=0.1; b:=0.1;
for d:=3 to n do
Begin
c:=a+b;
a:=b;
b:=c
end;
k:=c;
writeln (g, k);
close(f);
close(g);
End.

Vladimir_S 26.02.2012 20:29

И что не устраивает? На взгляд, всё правильно. Единственно - переменную k можно не вводить, а прямо вывести с, ну да это так, косметика.

Kazelina 27.02.2012 00:11

Цитата:

Сообщение от Vladimir_S (Сообщение 690026)
И что не устраивает?

Компилятор на первой проверке пишет "превышен лимит времени", а потом "неверный ответ". Остальные 18 тестов приняты. Всего 20 тестов. Не могу понять почему. Наверное, как то контестер так устроен. В чем то есть загвостка.

Vladimir_S 27.02.2012 09:55

Цитата:

Сообщение от Kazelina (Сообщение 690189)
В чем то есть загвостка.

И я, похоже, понял, в чем именно. Необходим форматный вывод вещественного результата, т.е. вместо
writeln (g, k);
надо
writeln (g, k:0:1);
А иначе в выходной файл пишется число вида
3.000000000000000E-001
а надо
0.3


Часовой пояс GMT +4, время: 00:30.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.