Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.85
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
#1

Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. - C++

14.11.2012, 21:10. Просмотров 3614. Ответов 41
Метки нет (Все метки)

Дана задача.
Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно.

Я написал нижеследующее, но программа выводит почему то такие числа как 12252240, 24504480 и т.д.
Что я тут неправильно написал?

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;
 
int main ()
{ int k=0;
   int a[9];
   int r=0;
  unsigned long int n=1000000000;
  bool flag=true;
  
  for (unsigned long int i=1234567890; i<=9876543210; i++)
 {  while (n>0)
  {
      a[r]=i/n; r++;
            
    i=i-(i/n*n); n=n/10;
    
  }
    
     for (int x=0; x<9; x++)
     { for (int y=x+1; y<10; y++)
         if (a[x]==a[y]) {flag=false; break;}
     }
      
 
     for (int j=2; j<=18; j++)
     {  if (i%j==0) k++; }  
 
 
     if (k==17 && flag==true) cout << i << " ";
     k=0; 
     
 }
 
return 0;
 }
Добавлено через 2 часа 6 минут
неужели никто не знает?


Кто-нибудь поможет сегодня?

Добавлено через 24 минуты
Попробовал изменить таким образом, но всё равно не работает

//////////////////////////////////////////////

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
 
int main ()
{ int k=0;
   int a[9];
   int r=0;
  unsigned long int n=1000000000;
  bool flag=true;
  bool flag2=true;
  
  for (unsigned long int i=1234567890; i<=9876543210; i++)
  {   for (int j=2; j<=18; j++)
  {  if (i%j==0) k++; }  
      if (k!=17) flag2=false; k=0;
      
      while (n>0)
  {
      a[r]=i/n; r++;
            
    i=i-(i/n*n); n=n/10;
    
  }
    
     for (int x=0; x<9; x++)
     { for (int y=x+1; y<10; y++)
         if (a[x]==a[y]) {flag=false; break;}
     }
      
 
     if (flag2==true && flag==true) cout << i << " ";
     
     
 }
 
return 0;
 }
Добавлено через 25 минут
Я подумал, что в самом низу где я вывожу i, i уже потерял своё значение, поэтому добавил дополнительную переменную m и присвоил ему значение i. Но программа всё равно не работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;
 
int main ()
{ int k=0;
   int a[9];
   int r=0;
  unsigned long int m;
  unsigned long int n=1000000000;
  bool flag=true;
  bool flag2=true;
  
  for (unsigned long int i=1234567890; i<=9876543210; i++)
  {   for (int j=2; j<=18; j++)
  {  if (i%j==0) k++; }  
  if (k!=17) {flag2=false;} k=0;
   m=i;
      
      while (n>0)
  {
      a[r]=i/n; r++;
            
    i=i-(i/n*n); n=n/10;
    
  }
    
     for (int x=0; x<9; x++)
     { for (int y=x+1; y<10; y++)
         if (a[x]==a[y]) {flag=false; break;}
     }
      
 
     if (flag2==true && flag==true) cout << m << " ";
     
     
 }
 
return 0;
 }
Добавлено через 11 минут
Обалдеть. Неужели никто не знает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2012, 21:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. (C++):

В данном натуральном числе переставить цифры таким образом, чтобы образовалось наименьшее число - C++
В данном натуральном числе переставить цифры таким образом, чтобы образовалось наименьшее число, записанное этими же цифрами. ...

В данном натуральном числе переставить цифры таким образом, чтобы образовалось наименьшее число, записанное этими цифрами - C++
1)В данном натуральном числе переставить цифры таким образом, чтобы образовалось наименьшее число, записанное этими же цифрами. 2)Дано...

В данном натуральном числе переставить цифры таким образом, чтобы получилось наименьшее число записанное этими же цифрами - C++
2. В данном натуральном числе переставить цифры таким образом, чтобы получилось наименьшее число записанное этими же цифрами.

В числе *4**3 дописать три цифры так, чтобы полученное число делилось на 15 - C++
В числе *4**3 дописать три цифры так, чтобы полученное число делилось на 15.

Перестановка цифр в числе таким образом, чтобы получить наименьшее число записанное этими же цифрами - C++
Дано: в данном натуральном числе переставить цифры таким образом, чтобы получилось наименьшее число записанное этими же цифрами. ...

Дано натуральное четырехзначное число. Определить все цифры в цифровой записи данного числа, на которые оно делится без остатка - C++
Дано натуральное четырехзначное число. Определить все цифры в цифровой записи данного числа, на которые оно делится без остатка. ...

41
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
14.11.2012, 22:27 #2
такого числа не существует я проверил
возможно я ошибаюсь, но, по-моему, программа верная.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
using namespace std;
int mask[10];
long int divisor;
long int half_life;
void solve(int l, int r){
    long int i;
    if (l==r){
        for (i=0, l^=r; l<10; l=l+1)
            i=i*10+mask[l];
            if (!(i%divisor))
                 cout<<"found i="<<i<<endl;
        
    }
    else
        for (int i=l; i<=r; i++){
            if (l-i){
                mask[l]^=mask[i];
                mask[i]^=mask[l];
                mask[l]^=mask[i];
                solve(l+1, r);
                mask[l]^=mask[i];
                mask[i]^=mask[l];
                mask[l]^=mask[i];
            }else
                solve(l+1, r);
            
        }
}
int main(int argc, char* argv[])
{
    setlocale(0, "russian");
    double x = 0;
    int a[10]; 
           //1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18
    divisor=   2*3*2*5*  7*2*3*   11   *13       *2*17;
    for (argc^=argc; argc<10; mask[argc]=argc)argc++;
    solve(0,9);
       cout<<"not found"<<endl;
    return 0;
}
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
14.11.2012, 23:01 #3
5968372410 3946752810 5738642910 4753869120 5381796420 4876391520 1675493820 7842965130 9527648130 5867291430 2819546730 6495218730 7256389140 6597831240 5678913240 3825761940 8691432750 3785942160 2438195760 2591348760 7293145860 1427385960 9325486170 3628194570 1284953670 4756932180 2765943180 2459637180 3179456280 1295674380 2485673190 2148736590 2761348590 6345128790

У меня такие выдал
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
15.11.2012, 00:42 #4
Вот по идее должна работать, но почему-то НЕ работает. Выдаёт всего 4 числа.
str.end() - 1 сделано специально. Так как число должно делиться на 10, 0 на конце должен быть по-любому.
Что-то на сон грядущий не соображу, где ошибка в трёх строчках.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
Выставить цифры в числе 1234567890 таким образом,
чтобы новое число делилось без остатка на все числа
от 2 до 18 включительно.
*/
 
#include <string>
#include <algorithm>
#include <iostream>
#include <stdlib.h>
 
int main(void)
{
    long divisor = 2 * 3 * 5 * 7 * 11 * 13 * 17;
    std::string str = "1234567890";
    do {
        long value = atoi(str.c_str());
        if (value % divisor == 0)
            std::cout << value << ' ';
    } while (std::next_permutation(str.begin(), str.end() - 1));
    std::cout << std::endl;
    system("pause");
    return 0;
};
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2012, 01:24 #5
std::stoll
мне кажется, у вас варианты в инт не умещаются
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.11.2012, 01:54 #6
Мне кажется что по условии задачи надо бы так сделать (+ добавил вывод в файл, а то на экран очень долго будет выводить):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
#include <iomanip>
using std::setw;
 
int main()
{
    setlocale (LC_ALL, "Russian");
    std::string str = "0123456789";
    std::fstream file;  
    file.open("file.txt", std::ios_base::out);
    if (!file.is_open())
    {
        std::cerr<<"Не удалось создать файл!"<<std::endl;
        system("pause");
        return -1;
    }
    long long temp;
    int i;
    do 
    {
        temp = std::stoll(str);
        for (i = 2; i<19; i++)
        {
            if (temp % i == 0) file<<setw(11)<<temp<<"  % "<<setw(2)<<i<<setw(4)<<"  == 0\n";
        }
    } while (std::next_permutation(str.begin(), str.end()));
    std::cout<<"Готово\n";
    system("pause");
    return 0;
}
Добавлено через 3 минуты
а нет, поспешил, все же не те числа будет выводить что надо по условию задачи.
0
Croessmah
Эксперт CЭксперт С++
13409 / 7559 / 853
Регистрация: 27.09.2012
Сообщений: 18,597
Записей в блоге: 3
Завершенные тесты: 1
15.11.2012, 02:11 #7
Цифры в числе могут повторяться?
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
15.11.2012, 10:46 #8
Цитата Сообщение от I.M. Посмотреть сообщение
У меня такие выдал
Наугад: 7256389140 - не делится на 16.

Чуть переработал программку, теперь ничего не выдаёт. Хм...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
Выставить цифры в числе 1234567890 таким образом,
чтобы новое число делилось без остатка на все числа
от 2 до 18 включительно.
*/
 
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <functional>
#include <stdlib.h>
 
class NullModulus
{
private:
    long val_;
public:
    typedef int argument_type;
    NullModulus(long Val) : val_(Val) {}
    bool operator()(int X) const { return (val_ % X == 0); }
};
 
int main(void)
{
    int divs[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 };
    std::vector<int> divisors;
    std::copy(divs, divs + sizeof(divs)/sizeof(divs[0]), std::back_inserter(divisors));
 
    std::string str = "1234567890";
    do {
        long value = atol(str.c_str());
        std::vector<int>::iterator p = std::find_if(divisors.begin(), divisors.end(), std::not1(NullModulus(value)));
        if (p == divisors.end())
            std::cout << value << ' ';
    } while (std::next_permutation(str.begin(), str.end()));
    std::cout << std::endl;
    system("pause");
    return 0;
};
Цитата Сообщение от I.M. Посмотреть сообщение
std::stoll
С++11. У меня нет этой библиотеки под рукой, поэтому atol пока что пользую.
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.11.2012, 11:33 #9
Я немного переделал цикл проверки, походу это 100% рабочий вариант. Находит 4 числа.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
#include <algorithm>
 
int main()
{
    setlocale (LC_ALL, "Russian");
    std::string str = "0123456789";
    long long temp;
    int i;
    do 
    {
        temp = std::stoll(str);
        for (i = 2; i<=19; i++)
        {
            if (i == 19)
            {
                std::cout<<temp<<std::endl;
                break;
            }
            if (temp % i == 0)
                continue;
            else
                break;
        }
    } while (std::next_permutation(str.begin(), str.end()));
    std::cout<<"Готово\n";
    system("pause");
    return 0;
}
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
15.11.2012, 12:04 #10
Что за числа, если не секрет?
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.11.2012, 12:10 #11
2438195760
3785942160
4753869120
4876391520
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
15.11.2012, 12:25 #12
исправил свою программу и всё заработало. Не ожидал просто, что число не поместится в тип long int. Надо было поставить unsigned long long.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
using namespace std;
int mask[10];
unsigned long long divisor;
unsigned long long half_life;
void solve(int l, int r){
    unsigned long long i;
    if (l==r){
        for (i=0, l^=r; l<10; l=l+1)
            i=i*10+mask[l];
        if (!(i%divisor))
                 cout<<"found i="<<i<<endl;
        
    }
    else
        for (int i=l; i<=r; i++){
            if (l-i){
                mask[l]^=mask[i];
                mask[i]^=mask[l];
                mask[l]^=mask[i];
                solve(l+1, r);
                mask[l]^=mask[i];
                mask[i]^=mask[l];
                mask[l]^=mask[i];
            }else
                solve(l+1, r);
            
        }
}
int main(int argc, char* argv[])
{
    setlocale(0, "russian");
    double x = 0;
    int a[10]; 
           //1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18
    divisor=   2*3*2*5*  7*2*3*   11   *13       *2*17;
    for (argc^=argc; argc<10; mask[argc]=argc)argc++;
    solve(0,9);
       cout<<"not found"<<endl;
    return 0;
}
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
15.11.2012, 12:46 #13
А у меня не влазят даже в unsigned long на 32х битной винде такие числа.
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2012, 13:02 #14
John Prick, если есть возможность используйте long long. У него гарантировано 64 бита и все уместится
А у меня был косяк в определении делителя. Я его получал перемножением всех простых чисел до 18. А надо было находить НОК для всех чисел от 2 до 18 включительно. Или вовсе прогонять циклом и проверять)
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
15.11.2012, 13:08 #15
I.M., так в том и дело, что нет возможности. std::stoll у меня нет в старой библиотеке, atol возвращает просто long, а что-нить типа atoll тоже не существует.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 13:08
Привет! Вот еще темы с ответами:

Отредактировать текст таким образом, чтобы все знаки препинания располагались в начале, за ним следовали цифры - C++
Дано некоторый текст. Отредактировать его таким образом, чтобы все знаки препинания располагались в начале строки, за ним следовали цифра,...

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

Определить все цифры в цифровой записи данного числа, на которые оно делится без остатка - C++
Дано натуральное четырехзначное число. Определить все цифры в цифровой записи данного числа, на которые оно делится без остатка. ...

Какие цифры (по одной справа и слева) надо приписать к числу 1022, чтобы полученное число делилось на 7, 8, 9 - C++
Вариант №1 Выяснить какие цифры(по одной справа и слева) надо приписать к числу 1022, чтобы полученное число делилось на 7, 8, 9.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
15.11.2012, 13:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru