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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.85
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
14.11.2012, 21:10     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #1
Дана задача.
Выставить цифры в числе 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 минут
Обалдеть. Неужели никто не знает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2012, 21:10     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно.
Посмотрите здесь:

Преобразовать строку таким образом, чтобы цифры каждого слова были перенесены в начало слова без изменения порядка следования их в слове C++
Перестановка цифр в числе таким образом, чтобы получить наименьшее число записанное этими же цифрами C++
В данном натуральном числе переставить цифры таким образом, чтобы образовалось наименьшее число, записанное этими цифрами C++
C++ В данном натуральном числе переставить цифры таким образом, чтобы получилось наименьшее число записанное этими же цифрами
В данном натуральном числе переставить цифры таким образом, чтобы образовалось наименьшее число C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
14.11.2012, 22:27     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #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;
}
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
14.11.2012, 23:01     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #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

У меня такие выдал
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
15.11.2012, 00:42     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #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;
};
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2012, 01:24     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #5
std::stoll
мне кажется, у вас варианты в инт не умещаются
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.11.2012, 01:54     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #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 минуты
а нет, поспешил, все же не те числа будет выводить что надо по условию задачи.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 02:11     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #7
Цифры в числе могут повторяться?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
15.11.2012, 10:46     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #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 пока что пользую.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.11.2012, 11:33     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #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;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.11.2012, 12:04     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #10
Что за числа, если не секрет?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.11.2012, 12:10     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #11
2438195760
3785942160
4753869120
4876391520
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.11.2012, 12:25     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #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;
}
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
15.11.2012, 12:46     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #13
А у меня не влазят даже в unsigned long на 32х битной винде такие числа.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2012, 13:02     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #14
John Prick, если есть возможность используйте long long. У него гарантировано 64 бита и все уместится
А у меня был косяк в определении делителя. Я его получал перемножением всех простых чисел до 18. А надо было находить НОК для всех чисел от 2 до 18 включительно. Или вовсе прогонять циклом и проверять)
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
15.11.2012, 13:08     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #15
I.M., так в том и дело, что нет возможности. std::stoll у меня нет в старой библиотеке, atol возвращает просто long, а что-нить типа atoll тоже не существует.
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
15.11.2012, 18:08  [ТС]     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #16
Цитата Сообщение от Croessmah Посмотреть сообщение
Цифры в числе могут повторяться?
цифры в числе не могут повторяться. Посмотрите мою программу, я там запустил 2 цикла на проверку если a[i]==a[j], то flag=false;
чтобы выводить flag должен быть всегда true.

Добавлено через 2 минуты
Цитата Сообщение от yuron_477 Посмотреть сообщение
2438195760
3785942160
4753869120
4876391520
А в моей программе где ошибка?

Добавлено через 6 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
исправил свою программу и всё заработало. Не ожидал просто, что число не поместится в тип 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;
}
Ничего у тебя не работает. У тебя бесконечность выдаёт.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2012, 18:14     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #17
Parilo, код рабочий
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
15.11.2012, 18:21  [ТС]     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #18
Цитата Сообщение от I.M. Посмотреть сообщение
Parilo, код рабочий
Мой код работает? А почему тогда у меня не работает? В чём может быть проблема? Есть соображения по этому поводу? Может из за компилятора?

Добавлено через 2 минуты
Цитата Сообщение от I.M. Посмотреть сообщение
Parilo, код рабочий
код рабочий чей мой или домовёнка? в Моём коде есть ошибка?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2012, 18:29     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #19
Цитата Сообщение от I.M. Посмотреть сообщение
Parilo, код рабочий
Я про код Kuzia domovenok. Его код рабочий.
А ваш код, Parilo, не верен.

Возьмите любое из четырех чисел:
2438195760
3785942160
4753869120
4876391520
и прогоните его через вашу проверку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 18:35     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно.
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.11.2012, 18:35     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. #20
У меня DevCPP тоже глючит. Это исключительно проблемы DevCPP
Дело в том, что переменная divisor и один из элементов массива расположены оказались по одному адресу в памяти.(я вроде не выхожу нигде за границы массива)
Костыль-решение: поменять местами строки
C++
1
2
unsigned long long divisor;
unsigned long long half_life;
На
C++
1
2
[CPP]unsigned long long half_life;
unsigned long long divisor;
[/CPP]
Yandex
Объявления
15.11.2012, 18:35     Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно.
Ответ Создать тему
Опции темы

Текущее время: 04:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru