IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Помогите, пожалуйста, написать код программы в Pascal ABC., Структурированный тип данных.
AnnetkaIce
сообщение 21.11.2011, 19:06
Сообщение #1


Новичок
*

Группа: Продвинутые
Сообщений: 4
Регистрация: 21.11.2011
Город: Пермь



Признак делимости. Дано натуральное число N (N<1000). Найти минимальное число A, которое делится нацело на N, и в десятичной записи которого используются лишь нули и единицы.
Например, для N=537; A=11010111.
С комментариями, если можно. Спасибо большое заранее.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
tig81
сообщение 21.11.2011, 19:30
Сообщение #2


Академик
********

Группа: Преподаватели
Сообщений: 15 617
Регистрация: 15.12.2007
Город: Украина, Запорожье
Учебное заведение: ЗНУ
Вы: преподаватель



Ваши идеи?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
AnnetkaIce
сообщение 1.12.2011, 19:43
Сообщение #3


Новичок
*

Группа: Продвинутые
Сообщений: 4
Регистрация: 21.11.2011
Город: Пермь



{Признак делимости. Дано натуральное число N (N<=1000).
Найти минимальное число A, которое делится нацело на N,
и в десятичной записи которого используются лишь нули и единицы.
Например, для N=537; A=11010111.}

uses crt;
var
N, i, m, S, K: integer;
A: string;
flag, error: boolean;

begin
writeln (' Признак делимости.');
// Вводим число N - нужный нам делитель
repeat
error := True;
writeln;
write ('N = ');
readln(N);

// "Защита от дурака":
If not((n>0) and (n<=1000)) then
begin
// "Защита от дурака_1": при попытке ввести число N>1000 программа выводит на экран сообщение об ошибке
if N>1000 then
writeln('Ошибка ввода №1! Вы ввели число N>1000. Пожалуйста, повторите ввод. N<1000');

// "Защита от дурака_2": при попытке ввести отрицательное число программа выводит на экран сообщение об ошибке
if N<0 then
writeln ('Ошибка ввода №2! Вы ввели отрицательное число. Пожалуйста, повторите ввод. N>0');

// "Защита от дурака_3": при попытке ввести число 0 программа выводит на экран сообщение об ошибке
if N=0 then
writeln ('Ошибка ввода №3! Вы же помните - на 0 делить нельзя! Пожалуйста, повторите ввод. N>0');
error:= false;
end;
until error;
// Поиск числа, которое делится на N
i:=0;
repeat
inc(i);
K:=N*i;
// Преобразуем число K в string в A
str(K,A);
// Проверяем цифры "числа" A:
S:=0;
for m:=1 to length(A) do
begin
if (A[m]='1') or (A[m]='0') then
inc(S);
if S=length(A) then
flag:=true;
end;
until flag;
// Выводим искомое минимальное делимое(т.е. число, на которое нацело делится N)
write('A = ');
writeln(A);
writeln;
write(' Программа завершенна.');
end.



проблема в том, что эта программа не эффективна. и, кроме того, я так и не дождалась результата при введении чисел, кратных 9, как исходных данных... помогите, на днях сдавать....
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Julia
сообщение 2.12.2011, 3:05
Сообщение #4


Ассистент
****

Группа: Julia
Сообщений: 593
Регистрация: 23.2.2007
Город: Улан-Удэ
Учебное заведение: БГУ
Вы: преподаватель



Для чисел кратных 9 недостаточно типа integer для переменной k, т.к. минимальное число, которое делится на 9 - это 111111111.

Для оптимизации вашего метода можно цикл с параметром
for m:=1 to length(A) do
begin
if (A[m]='1') or (A[m]='0') then
inc(S);
if S=length(A) then
flag:=true;
end;

заменить на цикл с условием.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
AnnetkaIce
сообщение 5.12.2011, 10:03
Сообщение #5


Новичок
*

Группа: Продвинутые
Сообщений: 4
Регистрация: 21.11.2011
Город: Пермь



каким образом: можете программу написать? или кусок ее... и она будет быстрее думать?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Julia
сообщение 5.12.2011, 15:05
Сообщение #6


Ассистент
****

Группа: Julia
Сообщений: 593
Регистрация: 23.2.2007
Город: Улан-Удэ
Учебное заведение: БГУ
Вы: преподаватель



...
m:=1;
flag:=false;
while (m<=length(A)) and ((A[m]='1') or (a[m]='0')) do
inc(m);
if m-1=length(A) then
flag:=true;
...
Программа будет выполнять гораздо меньше операций, а потому и быстрее работать.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
AnnetkaIce
сообщение 7.12.2011, 15:53
Сообщение #7


Новичок
*

Группа: Продвинутые
Сообщений: 4
Регистрация: 21.11.2011
Город: Пермь



программа работает точно так же, как и работала. что мне сделать, чтобы заработала так, как нужно? завтра сдавать
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 25.5.2025, 23:37

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru