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

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

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

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

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

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

Возьмите любое из четырех чисел:
2438195760
3785942160
4753869120
4876391520
и прогоните его через вашу проверку.
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
15.11.2012, 18:35 #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]
0
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
15.11.2012, 18:37  [ТС] #21
Цитата Сообщение от I.M. Посмотреть сообщение
Я про код Kuzia domovenok. Его код рабочий.
А ваш код, Parilo, не верен.

Возьмите любое из четырех чисел:
2438195760
3785942160
4753869120
4876391520
и прогоните его через вашу проверку.
А в моём коде где и в чём ошибка? Подскажите если не трудно? Заранее спасибо.
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
15.11.2012, 18:40 #22
Вообще, скажите, есть тема, где разбирается подобная проблема? Или никто не сталкивался?
0
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
15.11.2012, 19:00  [ТС] #23
Цитата Сообщение от Parilo Посмотреть сообщение
А в моём коде где и в чём ошибка? Подскажите если не трудно? Заранее спасибо.
Ну так в чём ошибка если код мой неверен?
0
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
18.11.2012, 18:36  [ТС] #24
Один из форумчанов сказал мне что мне нужно прокоментировать каждую строку, если хочу чтобы мне помогли.
Вот выкладываю свой код с комментариями. Помогите пожалуйста почему он не работает.

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

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
42
43
44
#include <iostream>
using namespace std;
 
int main ()
{ int k=0;
  
   int a[10];
   int r=0;
  unsigned long int m;
  unsigned long int n=1000000000;
    bool flag=true;
 
  
  for (unsigned long int i=1234567890; i<=9876543210; i++) // запускаем цикл проверки от 1234567890 до 9876543210.
  {  m=i; // присваиваем значение i переменной m, чтобы работать в цикле while ниже
 
      for (int j=2; j<=18; j++) // запускаем второй цикл for для проверки делится ли i на все числа от 2 до 18.
  {  if (i%j==0) k++; } // если делится k увеличиваем на +1.
      
   
        while (n>0) // запускаем цикл while чтобы
  {
      a[r]=m/n; r++;// определить каждую отдельную цифру числа m которой мы присвоили значение i в начале.
            
    m=m%n; n=n/10; // при этом уменьшаем n на 1/10 и m меняем каждый раз присваивая элементу массива a[r] каждую цифру числа i начиная с первого числа.
    
  }  
       for (int x=0; x<9; x++) // здесь мы запускаем 2 цикла for для проверки
     { for (int y=x+1; y<10; y++) // чтобы ни один из 10 элементом массива a[], то есть цифры числа не совпадали друг с другом.
     if (a[x]==a[y]) {flag=false; break;} // если же будет хоть одно совпадение, то flag присвоить false.
       }  
 
        
 
     if (k==17 && flag==true) cout << i << " "; // здесь мы выводим если переменная K равен 17, то есть делится без остатка 17 раз от 2 до 18 и flag равно true, то есть если все цифры в числе разные вывести i. 
     k=0; // присваиваем переменной k начальное значение 0, так как выше мы её успели изменить.
     n =1000000000;// присваиваем переменной n начальное значение 1000000000, так как выше мы её успели изменить.
     continue; // продолжаем цикл, так как выше мы поставили break
     
     
 }
 
return 0;
 }
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
18.11.2012, 20:01 #25
да хватит уже с этим кодом возиться
ошибка в 23й строчке. r изменяется от 0 до 403 подумай почему.
Но даже когда ты исправишь ошибку, подумай над своим подходом.
Ты 1) перебираешь ~9 миллиардов чисел, хотя народ решил тебе перебрав лишь порядка 3,5 миллионов перестановок.
2) проверяешь в цикле деление на каждый из 17ти делителей, хотя проверять надо лишь один раз деление на их НОК
короче, тебе предложили более оптимальное решение, чем в лоб.
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
18.11.2012, 20:35 #26
Parilo, а где переменной flag возвращается начальное значение?
0
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
19.11.2012, 19:34  [ТС] #27
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
да хватит уже с этим кодом возиться
ошибка в 23й строчке. r изменяется от 0 до 403 подумай почему.
Но даже когда ты исправишь ошибку, подумай над своим подходом.
Ты 1) перебираешь ~9 миллиардов чисел, хотя народ решил тебе перебрав лишь порядка 3,5 миллионов перестановок.
2) проверяешь в цикле деление на каждый из 17ти делителей, хотя проверять надо лишь один раз деление на их НОК
короче, тебе предложили более оптимальное решение, чем в лоб.
Кузя, не могли бы Вы уточнить почему в 23 строчке r изменяется от 0 до 403? Никак не могу понять, почему?
Я только только учусь и только понимая свои ошибки смогу чему то научиться. Объясните пожалуйста если можете.
Спасибо заранее

Добавлено через 4 минуты
Цитата Сообщение от I.M. Посмотреть сообщение
Parilo, а где переменной flag возвращается начальное значение?
Спасибо, I_M я присвоил начальное значение true переменной flag в конце, но он всё равно не работает. Где то у меня ещё ошибка. Пожалуйста не судите строго что я пишу сложный и тупой код, я только только учусь и пока только разбираюсь на простейших ошибках. Если знаете что именно в моём коде нужно изменить чтобы заработал, подскажите. Только пожалуйста не пишите свой код с применением классов и функций, я знаю что есть много более коротких и правильных путей решить эту задачу, но я хочу понять в своём коде где я ошибаюсь, и для этого я его прокомментировал полностью.
Заранее благодарю.
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
20.11.2012, 13:32 #28
Цитата Сообщение от Parilo Посмотреть сообщение
Кузя, не могли бы Вы уточнить почему в 23 строчке r изменяется от 0 до 403? Никак не могу понять, почему?
потому что r перед проверкой очередного числа надо обнулять, а то оно равно нулю только в самом начале программы. Тебе ж надо его обнулять в цикле по i перед каждым вхождением в цикл while, т.е. на строчке 20 надо писать r=0;

Добавлено через 23 минуты
а то сейчас заполняются элементы массива a[0]...a[9] только в первой итерации цикла по i
во второй программа пытается уже заполнить значениями a[10]...a[19], которых не существует

Добавлено через 53 секунды
но сам принцип поиска чисел с неповторяющимися цифрами просто ОООЧЕНЬ нерационален
0
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
20.11.2012, 18:21  [ТС] #29
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
потому что r перед проверкой очередного числа надо обнулять, а то оно равно нулю только в самом начале программы. Тебе ж надо его обнулять в цикле по i перед каждым вхождением в цикл while, т.е. на строчке 20 надо писать r=0;

Добавлено через 23 минуты
а то сейчас заполняются элементы массива a[0]...a[9] только в первой итерации цикла по i
во второй программа пытается уже заполнить значениями a[10]...a[19], которых не существует

Добавлено через 53 секунды
но сам принцип поиска чисел с неповторяющимися цифрами просто ОООЧЕНЬ нерационален
Кузя спасибо большое за подсказку, я в конце присвоил r начальное значение, но программа всё равно не работает.
Больше нигде ошибок нет? Если нет ошибок то программа должна работать, но она не работает. Никак не пойму.
Где ещё может быть ошибка?
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
20.11.2012, 19:21 #30
в чём выражается "не работает"? Или выводит неправильно? Или не компилируется из-за ошибок?Вылетает с похожим на предыдущее окошком? Или просто моргает курсором в консоли и ничего не выводит?

Если последнее, то скорее всего просто ооочень долго считает из-за (как я уже сказал) нерационального алгоритма.
0
20.11.2012, 19:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2012, 19:21
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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