С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

14.11.2012, 21:10. Просмотров 3708. Ответов 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
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.11.2012, 19:52 #31
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
У меня 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]
DevCPP это IDE. Из-за IDE такой проблемы не может быть.

Первая попавшая в голову реализация:

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
#include <iostream>
 
 
bool uniqDig( unsigned long long int number ) {
   bool digits[ 10 ] = { false };
   
   unsigned long long int tmp;
   
   while ( number ) {
      tmp = number % 10ULL;
      
      if ( digits[ tmp ])
         return false;
         
      digits[ tmp ] = true;
      
      number /= 10ULL;
   }
   
   return true;
}
 
int main() {
   unsigned long long int divider = 5ULL * 7 * 9 * 11 * 13 * 16 * 17;
   unsigned long long int num = divider;
 
   while ( num < 123456789ULL )
      num += divider;
 
   while ( num < 9876543211ULL ) {
      if ( uniqDig( num ))
         std::cout << num << std::endl;
         
      num += divider;
   }
   
   return 0;
}
0
Kuzia domovenok
2060 / 1905 / 174
Регистрация: 25.03.2012
Сообщений: 6,561
Записей в блоге: 1
20.11.2012, 23:20 #32
Цитата Сообщение от Toshkarik Посмотреть сообщение
DevCPP это IDE. Из-за IDE такой проблемы не может быть.
Что, за дурака что ли держишь? Я собственными руками делал и глазами видел, что адреса двух глобальных переменных оказались равны. MSVS себе такого не позволяет!
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
21.11.2012, 06:13 #33
Kuzia domovenok, Вы о чем вообще? Что MSVS, что DevCPP - IDE. Они не компилируют файлы. В поставке с DevCPP идет GCC, в MSVS - microsoft compiler. А IDE всего лишь позволяет удобно редактировать текст исходных файлов. С DevCPP, скорей всего, идет старая версия GCC. Но, похоже, у Вас одного "две переменные расположены по одному адресу".

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
(я вроде не выхожу нигде за границы массива)
А теперь вместо глобального массива int mask[ 10 ]; Попробуйте использовать std::vector mask( 10, 0 );. И каждое обращение замените с mask[ index ] на mask.at( index ). Вы получите исключение out of range, что подтверждает факт выхода за пределы. И расположен он вот в этом кусочке:
C++
1
for (argc^=argc; argc<10; mask[argc]=argc)argc++;
0
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
21.11.2012, 06:36  [ТС] #34
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
в чём выражается "не работает"? Или выводит неправильно? Или не компилируется из-за ошибок?Вылетает с похожим на предыдущее окошком? Или просто моргает курсором в консоли и ничего не выводит?

Если последнее, то скорее всего просто ооочень долго считает из-за (как я уже сказал) нерационального алгоритма.
Кузя, просто моргает курсором и ничего не выводит. Не может же он так долго считать? Я его 2 часа открытым держал. Я думаю этого времени достаточно чтобы просчитать. А он просто моргает.
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
21.11.2012, 07:04 #35
Kuzia domovenok, вдруг если сами не поймете - выражение mask[argc]=argc в этом цикле вычисляется после выполнения тела цикла. Поэтому, когда argc становится 10, сначала вычисляется выражение mask[argc]=argc, а потом уже идет проверка условия продолжения цикла. Вообще изменения счетчиков в теле цикла - не очень хорошая идея.

Parilo, У Вас ошибка в том, что вы используете тип unsigned long, в который числа больше 4 млрд. на помещаются. Используйте unsigned long long. И к большим константам, вроде 9876543210 приписывайте в конце суффикс ull, так как по умолчанию, все целочисленные константы имеют тип int.
1
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
21.11.2012, 09:46  [ТС] #36
Цитата Сообщение от Toshkarik Посмотреть сообщение
Kuzia domovenok, вдруг если сами не поймете - выражение mask[argc]=argc в этом цикле вычисляется после выполнения тела цикла. Поэтому, когда argc становится 10, сначала вычисляется выражение mask[argc]=argc, а потом уже идет проверка условия продолжения цикла. Вообще изменения счетчиков в теле цикла - не очень хорошая идея.

Parilo, У Вас ошибка в том, что вы используете тип unsigned long, в который числа больше 4 млрд. на помещаются. Используйте unsigned long long. И к большим константам, вроде 9876543210 приписывайте в конце суффикс ull, так как по умолчанию, все целочисленные константы имеют тип int.
Я использую компилятор Visual c++ 6.0 Почему то он у меня не понимает тип unsigned long long. Может попорбовать unsigned long long int? Этот тоже помоему не поймёт, дома вечером проверю. и Ещё ull надо без пробела приписывать слитно с числом?
Можно показать как он приписывается в моём коде если можно?
Спасибо.
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
21.11.2012, 09:52 #37
Цитата Сообщение от Parilo Посмотреть сообщение
ull надо без пробела приписывать слитно с числом?
Да, слитно. 9876543210ull.
Цитата Сообщение от Parilo Посмотреть сообщение
Я использую компилятор Visual c++ 6.0
Тогда Вам не решить данную задачу Вашим способом. Эта версия студии не поддерживает новый стандарт, в котором введен тип long long.

PS: я просмотрел полностью Ваш код. В нем очень много ошибок, все их перечислять не буду, вот некоторые:
Не сбрасываете значение flag при проверке нового числа.
Не обнуляете r при проверке нового числа, из-за чего выходите за пределы массива уже на втором числе.
Оператор break относится только к ближайшему циклу или оператору switch. Поэтому будет прерван только цикл for (int y=x+1; y<10; y++)
Оператор continue в конце ни к чему.

И так можно долго.
0
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
24.11.2012, 14:38  [ТС] #38
Цитата Сообщение от Toshkarik Посмотреть сообщение
Да, слитно. 9876543210ull.

Тогда Вам не решить данную задачу Вашим способом. Эта версия студии не поддерживает новый стандарт, в котором введен тип long long.

PS: я просмотрел полностью Ваш код. В нем очень много ошибок, все их перечислять не буду, вот некоторые:
Не сбрасываете значение flag при проверке нового числа.
Не обнуляете r при проверке нового числа, из-за чего выходите за пределы массива уже на втором числе.
Оператор break относится только к ближайшему циклу или оператору switch. Поэтому будет прерван только цикл for (int y=x+1; y<10; y++)
Оператор continue в конце ни к чему.

И так можно долго.
Тошкарик, спасибо за помощь! Я конечно понимаю, что я чайник в программировании и пока только учусь, ну вот насчёт "так можно долго.." я конечно не согласен))), кроме обнуления r и flag, там больше практически ошибок не было, что я уже сделал. Continue даже если и не нужен, по крайней мере не мешает)).
Ладно, спасибо большое в любом случае. Подскажите пожалуйста какой компилятор лучше всего использовать для таких программ?
Спасибо.
0
Kuzia domovenok
2060 / 1905 / 174
Регистрация: 25.03.2012
Сообщений: 6,561
Записей в блоге: 1
24.11.2012, 14:45 #39
скачай msvs и не думай о компиляторах
1
Parilo
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
26.11.2012, 19:46  [ТС] #40
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
скачай msvs и не думай о компиляторах
Я так думаю MSVS это Microsoft Visual Studio верно?
Я скачал с сайта Майкрософт Microsoft Visual C++ 2010 Express Edition. И также программа не работает, просто мигает курсором.

Код финальный после всех исправлений. Блин запарился с этим кодом. Что делать чтобы работал и ull Добавил и 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
42
43
44
45
46
47
#include <StdAfx.h> 
#include <iostream>
using namespace std;
 
int main ()
{ int k=0;
  
   int a[10];
   int r=0;
  unsigned long long m;
  unsigned long long n=1000000000ull;
    bool flag=true;
 
  
  for (unsigned long long i=1234567890ull; i<=9876543210ull; i++) 
  {  m=i; 
 
      for (int j=2; j<=18; j++) 
  {  if (i%j==0) k++; } 
      
   
        while (n>0) 
  {
      a[r]=m/n; r++;
            
    m=m%n; n=n/10; 
    
  }  
       for (int x=0; x<9; x++) 
     { for (int y=1; y<10; y++) 
     if (a[x]==a[y]) {flag=false; break;} 
       }  
          continue; 
        
 
     if (k==17 && flag==true) cout << i << " "; 
     k=0; 
     n =1000000000ull;
     if (flag==false) flag=true;
     r=0;
      
     
     
 }
 
return 0;
 }
0
Kuzia domovenok
2060 / 1905 / 174
Регистрация: 25.03.2012
Сообщений: 6,561
Записей в блоге: 1
26.11.2012, 21:32 #41
всё нормально, просто подожди достаточно времени, чтобы дождаться результата.
Или используй нормальный, алгоритм как я советовал, а не топорный перебор 10 миллиардов чисел * на проверку 90 цифр в каждом цикле - итого 900 миллиардов проверок не считая мелочи.
Ерунда сущая. У меня за 5 минут проверил меньше миллиарда чисел, значит полная проверка займёт примерно час.
А так всё в порядке
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
26.11.2012, 21:37 #42
Parilo, Вы понимаете, что код после continue; никогда не выполняется?
0
26.11.2012, 21:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 21:37
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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