Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск натуральных чисел.

5.7K
27 мая 2006 года
denxx
45 / / 05.01.2006
Привет всем!
Мне тут задали задачу на С++, а ч незнаю как ее решать!!! Помогите кто может вроде бы задача простая, а я решить немогу :( . Заранее очень благодарен за помощь.
Вот задание:
Найти все натуральные числа не превосходящие N (задается с клавиатуры) и делящиеся на каждую из своих цифр.
5.3K
27 мая 2006 года
r000n_m
177 / / 26.02.2006
Простым перебором?
5.7K
28 мая 2006 года
denxx
45 / / 05.01.2006
Цитата:
Originally posted by r000n_m
Простым перебором?


Да, надеюсь это просто???

242
28 мая 2006 года
Оlga
2.2K / / 04.02.2006
Код:
#include <stdio.h>
int main(void)
{
    int N = 100;
    int flag;

    for(int i = 3; i < N; i++)
    {
        flag = 1;
        for(int j = 2; j < [color=green](i/2)+1[/color]; j++)
            if(i % j == 0) flag = 0;

        if(flag) printf("%d ", i);
    }

    putchar('\n');

    return 0;
}

во 2-ом форе вместо j < i можно достаточно вроде взять j < (i/2+1)
929
28 мая 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by OlgaKr
Код:
#include <stdio.h>
int main(void)
{
    int N = 100;
    int flag;

    for(int i = 3; i < N; i++)
    {
        flag = 1;
        for(int j = 2; j < i; j++)
            if(i % j == 0) flag = 0;

        if(flag) printf("%d ", i);
    }

    putchar('\n');

    return 0;
}

во 2-ом форе вместо j < i можно достаточно вроде взять j < (i/2+1) или минус 1
точно не помню


Насколько я понял, эта программа найдет все простые числа, а нужно те, которые делятся на каждую из своих цифр, например, 12 - делится и на 1, и на 2.

242
28 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by sp999
Насколько я понял, эта программа найдет все простые числа, а нужно те, которые делятся на каждую из своих цифр, например, 12 - делится и на 1, и на 2.


Код:
#include <stdio.h>
int ifBelong(int , int );
int main(void)
{
    int N = 100;
    int flag;

    for(int i = 3; i < N; i++)
    {
        flag = 1;
        for(int j = 2; j < (i/2+1); j++)
            if(ifBelong(i,j) && i % j)
            {
                flag = 0;
                break;
            }
            else if(i % j == 0)
            {
                flag = 0;
                break;
            }
           
        if(flag) printf("%d ", i);
    }

    putchar('\n');

    return 0;
}
int ifBelong(int num, int j)
{
     while(num != 0)
     {
        if((num%10) == j) return 1;
        num = num / 10;
     }
     return 0;
}
242
28 мая 2006 года
Оlga
2.2K / / 04.02.2006
или опять ме поняла что делать
:-?P(
929
28 мая 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by OlgaKr
или опять ме поняла что делать
:-?P(


Ну что-то вроде этого, только мне кажется цикл по j надо делать от 2 до 9 (других цифр-то нет, на 1 по-любому делиться будет, вот только что с нулем делать это я не представляю).

242
28 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by sp999
Ну что-то вроде этого, только мне кажется цикл по j надо делать от 2 до 9 (других цифр-то нет, на 1 по-любому делиться будет, вот только что с нулем делать это я не представляю).


с нулем все нормально, т.к. j не может быть нулем
ну а насчет от 2 до 9 не уверенна

929
28 мая 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by OlgaKr
с нулем все нормально, т.к. j не может быть нулем
ну а насчет от 2 до 9 не уверенна


Ну если нуль не брать в расчет, то все будет в шоколаде.
Насчет от 2 до 9.
Если проверять числа однозначные, то согласен будут выполняться лишние итерации.
Но если проверять даже двузначные числа свыше 20, то тут лишних итераций будет куда больше, например, число 44 - итераций будет 23 вместо 8.
Вообще наиболее оптимальным было бы сразу определить цифры числа и проверять только их.

5.7K
28 мая 2006 года
denxx
45 / / 05.01.2006
Цитата:
Originally posted by sp999
Ну если нуль не брать в расчет, то все будет в шоколаде.
Насчет от 2 до 9.
Если проверять числа однозначные, то согласен будут выполняться лишние итерации.
Но если проверять даже двузначные числа свыше 20, то тут лишних итераций будет куда больше, например, число 44 - итераций будет 23 вместо 8.
Вообще наиболее оптимальным было бы сразу определить цифры числа и проверять только их.


Огромное спасибо всем за помощь!!!

242
29 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by denxx
Огромное спасибо всем за помощь!!!



надеюсь ты заметил что 2-ой вариант решения он с багом :)
т.к. подходит для j - одназначное число + нам надо проверить
что данное число делится на каждую из цифр, которая в него входит.

Но если честно задача меня запутала, т.к. простое число - это
число которое делится на 1 и само себя(т.е. не имеет делителя),
поэтому условие насчет цифр весьма странно для меня и подходит
для чисел из одной цифры или состоящим из единиц(111 например).

242
29 мая 2006 года
Оlga
2.2K / / 04.02.2006
кстати если уж речь идет что j не обязательно одназначное число, то
обязательно надо добавить проверку на ноль
929
29 мая 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by OlgaKr
надеюсь ты заметил что 2-ой вариант решения он с багом :)
т.к. подходит для j - одназначное число + нам надо проверить
что данное число делится на каждую из цифр, которая в него входит.

Но если честно задача меня запутала, т.к. простое число - это
число которое делится на 1 и само себя(т.е. не имеет делителя),
поэтому условие насчет цифр весьма странно для меня и подходит
для чисел из одной цифры или состоящим из единиц(111 например).


Ну почему же?
А как же 12, 24, 48 и всякие, состоящие из одинаковых цифр, например 22, 444, 3333?

242
29 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by sp999
Ну почему же?
А как же 12, 24, 48 и всякие, состоящие из одинаковых цифр, например 22, 444, 3333?


так простые числа не имеют делителя (кроме единицы), поэтом 333 и т.д.
это не простое число

929
29 мая 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by OlgaKr
так простые числа не имеют делителя (кроме единицы), поэтом 333 и т.д.
это не простое число


Но в задаче не было речи о простых числах, шла речь о натуральных числах.

242
29 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by sp999
Но в задаче не было речи о простых числах, шла речь о натуральных числах.



ну тогда меня на мыло :D
за что сказали спасибо не знаю :roll:

242
29 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by sp999
Но в задаче не было речи о простых числах, шла речь о натуральных числах.


Код:
#include <stdio.h>
int ifBelong(int );
int main(void)
{
    int N = 100;
   
    for([color=green]int i = 1[/color]; i < N; i++)
    {
        if(ifBelong(i)) printf("%d ", i);
    }

    putchar('\n');

    return 0;
}
int ifBelong(int num)
{
    int j = num;
     while(j != 0)
     {
        if((j%10) && num%(j%10) ) return 0;
        j = j / 10;
     }
     return 1;
}


надеюсь багов нет
929
29 мая 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by OlgaKr
Код:
#include <stdio.h>
int ifBelong(int );
int main(void)
{
    int N = 100;
   
    for(int i = 3; i < N; i++)
    {
        if(ifBelong(i)) printf("%d ", i);
    }

    putchar('\n');

    return 0;
}
int ifBelong(int num)
{
    int j = num;
     while(j != 0)
     {
        if((j%10) && num%(j%10) ) return 0;
        j = j / 10;
     }
     return 1;
}


надеюсь багов нет


все ок, только не выдает чисел 1 и 2, а они тоже натуральные (цикл надо начать с 1).

242
29 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by sp999
все ок, только не выдает чисел 1 и 2, а они тоже натуральные (цикл надо начать с 1).


забыла фор поправить, ух на на меня

9.4K
29 мая 2006 года
_nоrth_
99 / / 24.04.2006
Мне кажется, что например 10 не делится на все свои цифры.
Код:
int ifBelong(int num)
{
  int j = num;
  while(j!=0)
  {
    int k = j%10;
    if((k==0)||((num%k)!=0))return 0;
    j = j/10;
  }
  return 1;
}
242
29 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by _nоrth_
Мне кажется, что например 10 не делится на все свои цифры.


Код:
#include <stdio.h>
int ifBelong(int );
int main(void)
{
    int N = 100;
   
    for(int i = 1; i < N; i++)
    {
        if(ifBelong(i)) printf("%d ", i);
    }

    putchar('\n');

    return 0;
}
int ifBelong(int num)
{
    int j = num;
     while(j != 0)
     {
        if([color=red]!(j%10) || num%(j%10)[/color] ) return 0;
        j = j / 10;
     }
     return 1;
}

ну тогда можно так :)
929
29 мая 2006 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by _nоrth_
Мне кажется, что например 10 не делится на все свои цифры.
Код:
int ifBelong(int num)
{
  int j = num;
  while(j!=0)
  {
    int k = j%10;
    if((k==0)||((num%k)!=0))return 0;
    j = j/10;
  }
  return 1;
}


Это как?
0 - мы договорились не трогать, так как деление на нуль ни к чему хорошему не приведет.
1 - на 1 делятся все числа, в том числе (каламбур) и число 10.
Что не так?

242
29 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by sp999
Это как?
0 - мы договорились не трогать, так как деление на нуль ни к чему хорошему не приведет.
1 - на 1 делятся все числа, в том числе (каламбур) и число 10.
Что не так?


хэвре(друзья :)) пусть автор топика разберется что трогать или нет
в конце концов изначально задача не была понята мною правильно

у меня нет деления на ноль
в С если идет o or(||) и первое условие выполняется, тогда второе не проверяется(оптимизация языка)


Бсем спасибо за помощь :) :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог