Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 25.02.2012, 18:37   #1 (permalink)
Kazelina
Новичок
 
Регистрация: 25.02.2012
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Помогите разобраться

Я только начала разбираться в программировании. Так что не судите строго. Дана такая задача.
Дано натуральное число 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.
Kazelina вне форума   Ответить с цитированием

Старый 25.02.2012, 18:37
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Данные топики имеют сходства с вашим, рекомендую прочитать

Помогите разобраться
Помогите разобраться

Старый 25.02.2012, 19:19   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Спасибо, что уделили внимание Владимир. Поправку вашу учла, спасибо, что подсказали. Я пользуюсь Паскалем 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.

Здесь что-то опять не так. А что не могу понять. Буду признательна.
Kazelina вне форума   Ответить с цитированием
Старый 25.02.2012, 21:45   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Kazelina Посмотреть сообщение
Здесь что-то опять не так. А что не могу понять. Буду признательна.
Ну, прежде всего, "не так" то, что Вы решаете не совсем ту задачу, а точнее задачу, существенно упрощенную: вместо проверки на то, что корень является простым числом, Вы делаете проверку на то, что он является числом целым.
Vladimir_S вне форума   Ответить с цитированием
Старый 25.02.2012, 23:39   #5 (permalink)
Kazelina
Новичок
 
Регистрация: 25.02.2012
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
вместо проверки на то, что корень является простым числом, Вы делаете проверку на то, что он является числом целым.
Аааа, ну да же простым, я что-то запуталась, уже с этими задачами.

А как же исправить?
Kazelina вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 26.02.2012, 10:35   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Kazelina Посмотреть сообщение
А как же исправить?
Например, так:
Код:
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 возникнет ошибка зацикливания.
Vladimir_S вне форума   Ответить с цитированием
Старый 26.02.2012, 18:15   #7 (permalink)
Kazelina
Новичок
 
Регистрация: 25.02.2012
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

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

На каждом следующем дне рождения Винни Пух съедает столько же меда, что и на двух предыдущих. На двух первых днях рождения у Пяточка и у Кролика он съел по 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.
Kazelina вне форума   Ответить с цитированием
Старый 26.02.2012, 20:29   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

И что не устраивает? На взгляд, всё правильно. Единственно - переменную k можно не вводить, а прямо вывести с, ну да это так, косметика.
Vladimir_S вне форума   Ответить с цитированием
Старый 27.02.2012, 00:11   #9 (permalink)
Kazelina
Новичок
 
Регистрация: 25.02.2012
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
И что не устраивает?
Компилятор на первой проверке пишет "превышен лимит времени", а потом "неверный ответ". Остальные 18 тестов приняты. Всего 20 тестов. Не могу понять почему. Наверное, как то контестер так устроен. В чем то есть загвостка.
Kazelina вне форума   Ответить с цитированием
Старый 27.02.2012, 09:55   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.