AnnetkaIce
Сообщение
#78262 21.11.2011, 19:06
Признак делимости. Дано натуральное число N (N<1000). Найти минимальное число A, которое делится нацело на N, и в десятичной записи которого используются лишь нули и единицы.
Например, для N=537; A=11010111.
С комментариями, если можно. Спасибо большое заранее.
tig81
Сообщение
#78263 21.11.2011, 19:30
Ваши идеи?
AnnetkaIce
Сообщение
#78770 1.12.2011, 19:43
{Признак делимости. Дано натуральное число 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
Сообщение
#78774 2.12.2011, 3:05
Для чисел кратных 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
Сообщение
#78866 5.12.2011, 10:03
каким образом: можете программу написать? или кусок ее... и она будет быстрее думать?
Julia
Сообщение
#78879 5.12.2011, 15:05
...
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
Сообщение
#78914 7.12.2011, 15:53
программа работает точно так же, как и работала. что мне сделать, чтобы заработала так, как нужно? завтра сдавать
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.