• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

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

Kazelina

Ученик
Регистрация
25 Фев 2012
Сообщения
5
Реакции
0
Баллы
0
Помогите разобраться

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

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

А как же исправить?
 
А как же исправить?
Например, так:
Код:
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 возникнет ошибка зацикливания.
 
Спасибо еще раз. Разобралась я в задаче. Теперь всё правильно.

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

На каждом следующем дне рождения Винни Пух съедает столько же меда, что и на двух предыдущих. На двух первых днях рождения у Пяточка и у Кролика он съел по 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.
 
И что не устраивает? На взгляд, всё правильно. Единственно - переменную k можно не вводить, а прямо вывести с, ну да это так, косметика.
 
И что не устраивает?
Компилятор на первой проверке пишет "превышен лимит времени", а потом "неверный ответ". Остальные 18 тестов приняты. Всего 20 тестов. Не могу понять почему. Наверное, как то контестер так устроен. В чем то есть загвостка.
 
В чем то есть загвостка.
И я, похоже, понял, в чем именно. Необходим форматный вывод вещественного результата, т.е. вместо
writeln (g, k);
надо
writeln (g, k:0:1);
А иначе в выходной файл пишется число вида
3.000000000000000E-001
а надо
0.3
 
Назад
Сверху