Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2010, 20:54   #1
Vitaly409
 
Регистрация: 02.12.2010
Сообщений: 5
Печаль Циклические конструкции и итерационные алгоритмы

Используя перебор значений найти все натуральные числа, не превосходящие заданного N и делящиеся на каждую из своих цифр.


Но без массива))))) Плиз не могу никак сделать HELP профессионалы!!!)))))
Vitaly409 вне форума Ответить с цитированием
Старый 02.12.2010, 23:17   #2
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Код:
var
i,j,n,p:integer;

begin
for i:=1 to n do begin
p:=0;
for j:=1 to length(inttostr(i)) do
if i mod strtoint(copy(inttostr(i), j, 1))<>0 then p:=p+1;
if p=0 then {вывести i};
end;
end;
на delphi примерно так...

если на паскале, то там вместо inttostr(strtoint) придется использовать
Val(S, x, k) - для перевода строки в число
и
Str(x, S) - для перевода числа в строку

Последний раз редактировалось unbanned; 02.12.2010 в 23:28.
unbanned вне форума Ответить с цитированием
Старый 03.12.2010, 00:14   #3
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Держи.

Код:
#include <iostream>
#include <assert.h>

bool test(int num)
{
    assert(num > 0);
    for(int n = num; n; n /= 10)
    {
        int dig = n % 10;
        if(!dig || num % dig) return false;
    }
    return true;
}

int main(int, char *[])
{
    int N;
    std::cout << "N?";
    std::cin >> N;
    for(int n = 1; n <= N; ++n)
        if(test(n)) std::cout << n << ' ';
    std::cout << std::endl;
    return 0;
}
P.S. Случай, когда одна из цифр числа 0 -- спорный, неясно, как в таком случае поступать. В данном варианте такое число не проходит тест.
P.P.S. 2Unbanned: на каждой итерации преобразовывать число в строку -- имхо, перебор... Да и вообще тут строковые преобразования не нужны.

Последний раз редактировалось sergey.d; 03.12.2010 в 00:23.
sergey.d вне форума Ответить с цитированием
Старый 03.12.2010, 01:18   #4
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Цитата:
Сообщение от sergey.d Посмотреть сообщение
[CODE]P.P.S. 2Unbanned: на каждой итерации преобразовывать число в строку -- имхо, перебор... Да и вообще тут строковые преобразования не нужны.
я Си плохо знаю.. практически совсем не знаю... поэтому код непонятен мне. согласен что преобразования сказываются на производительности... но другого варианта без массива не вижу
unbanned вне форума Ответить с цитированием
Старый 03.12.2010, 01:28   #5
sergey.d
Пользователь
 
Регистрация: 23.08.2010
Сообщений: 98
По умолчанию

Цитата:
Сообщение от unbanned Посмотреть сообщение
я Си плохо знаю.. практически совсем не знаю... поэтому код непонятен мне. согласен что преобразования сказываются на производительности... но другого варианта без массива не вижу
Поверь, он есть! Для натурального числа N выражение N mod 10 дает младшую цифру числа, а N := N div 10 присваивает N значение, полученное сдвигом цифр в записи N вправо с отбрасыванием младшей цифры. Кстати, алгоритм преобразования числа в строку так и работает. Эх, тряхну стариной, за ошибки в коде сильно не бить, на паскале писал лет 15 назад. Вот проверка, делится ли число на значение одной из своих цифр:

Код:
function Test(N: integer): boolean
begin
  var K,D: integer; R: boolean;
  K := N;
  R := true;

  while K <> 0 do
  begin
    D := K mod 10;
    if D = 0 then begin R := false; break; end;
    if N mod D <> 0 then begin R := false; break; end;
    K := K div 10;
  end

  Test := R; 
end;

Последний раз редактировалось sergey.d; 03.12.2010 в 01:46.
sergey.d вне форума Ответить с цитированием
Старый 03.12.2010, 11:13   #6
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

теперь понятно. точно, забыл про 10ку
unbanned вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклические алгоритмы Anwen Помощь студентам 0 20.11.2010 16:12
Циклические алгоритмы Lena neznayka Паскаль, Turbo Pascal, PascalABC.NET 7 14.06.2010 12:08
VBA.Циклы.Линейные алгоритмы.Условные конструкции. Екатерина нск Помощь студентам 1 17.01.2010 17:37
что такое итерационные алгоритмы ThisIzGame Помощь студентам 6 11.01.2010 17:13