Помогите разобраться
Я только начала разбираться в программировании. Так что не судите строго. Дана такая задача.
Дано натуральное число 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 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 можно не вводить, а прямо вывести с, ну да это так, косметика.
|
Цитата:
|
Цитата:
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.