14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
||||||||||||||||
1 | ||||||||||||||||
Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно.14.11.2012, 21:10. Показов 6333. Ответов 41
Метки нет (Все метки)
Дана задача.
Выставить цифры в числе 1234567890 таким образом, чтобы новое число делилось без остатка на все числа от 2 до 18 включительно. Я написал нижеследующее, но программа выводит почему то такие числа как 12252240, 24504480 и т.д. Что я тут неправильно написал? /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
неужели никто не знает? Кто-нибудь поможет сегодня? Добавлено через 24 минуты Попробовал изменить таким образом, но всё равно не работает //////////////////////////////////////////////
Я подумал, что в самом низу где я вывожу i, i уже потерял своё значение, поэтому добавил дополнительную переменную m и присвоил ему значение i. Но программа всё равно не работает.
Обалдеть. Неужели никто не знает?
0
|
14.11.2012, 21:10 | |
Ответы с готовыми решениями:
41
В данном натуральном числе переставить цифры таким образом, чтобы образовалось наименьшее число Припишите к 523*** три такие цифры справа ,чтобы полученное шестизначное число делилось на 7,на 8 и на 9 без остатка припишите к 523*** три такие цифры справа, чтобы полученное шестизначное число делилось на 7, на 8 и на 9 без остатка Переставить цифры числа таким образом, чтобы получилось минимальное возможное число без ведущих нулей |
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
|
15.11.2012, 18:37 [ТС] | 21 |
0
|
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
|
15.11.2012, 19:00 [ТС] | 23 |
0
|
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
||||||
18.11.2012, 18:36 [ТС] | 24 | |||||
Один из форумчанов сказал мне что мне нужно прокоментировать каждую строку, если хочу чтобы мне помогли.
Вот выкладываю свой код с комментариями. Помогите пожалуйста почему он не работает. Задание напомню- Выставить цифры в числе 1234567890 таким образом чтобы новое число делилось без остатка на все числа от 2 до 18.
0
|
18.11.2012, 20:01 | 25 |
да хватит уже с этим кодом возиться
ошибка в 23й строчке. r изменяется от 0 до 403 подумай почему. Но даже когда ты исправишь ошибку, подумай над своим подходом. Ты 1) перебираешь ~9 миллиардов чисел, хотя народ решил тебе перебрав лишь порядка 3,5 миллионов перестановок. 2) проверяешь в цикле деление на каждый из 17ти делителей, хотя проверять надо лишь один раз деление на их НОК короче, тебе предложили более оптимальное решение, чем в лоб.
0
|
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
|
|
18.11.2012, 20:35 | 26 |
Parilo, а где переменной flag возвращается начальное значение?
0
|
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
|
19.11.2012, 19:34 [ТС] | 27 |
Кузя, не могли бы Вы уточнить почему в 23 строчке r изменяется от 0 до 403? Никак не могу понять, почему?
Я только только учусь и только понимая свои ошибки смогу чему то научиться. Объясните пожалуйста если можете. Спасибо заранее Добавлено через 4 минуты Спасибо, I_M я присвоил начальное значение true переменной flag в конце, но он всё равно не работает. Где то у меня ещё ошибка. Пожалуйста не судите строго что я пишу сложный и тупой код, я только только учусь и пока только разбираюсь на простейших ошибках. Если знаете что именно в моём коде нужно изменить чтобы заработал, подскажите. Только пожалуйста не пишите свой код с применением классов и функций, я знаю что есть много более коротких и правильных путей решить эту задачу, но я хочу понять в своём коде где я ошибаюсь, и для этого я его прокомментировал полностью. Заранее благодарю.
0
|
20.11.2012, 13:32 | 28 |
потому что r перед проверкой очередного числа надо обнулять, а то оно равно нулю только в самом начале программы. Тебе ж надо его обнулять в цикле по i перед каждым вхождением в цикл while, т.е. на строчке 20 надо писать r=0;
Добавлено через 23 минуты а то сейчас заполняются элементы массива a[0]...a[9] только в первой итерации цикла по i во второй программа пытается уже заполнить значениями a[10]...a[19], которых не существует Добавлено через 53 секунды но сам принцип поиска чисел с неповторяющимися цифрами просто ОООЧЕНЬ нерационален
0
|
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
|
20.11.2012, 18:21 [ТС] | 29 |
Кузя спасибо большое за подсказку, я в конце присвоил r начальное значение, но программа всё равно не работает.
Больше нигде ошибок нет? Если нет ошибок то программа должна работать, но она не работает. Никак не пойму. Где ещё может быть ошибка?
0
|
20.11.2012, 19:21 | 30 |
в чём выражается "не работает"? Или выводит неправильно? Или не компилируется из-за ошибок?Вылетает с похожим на предыдущее окошком? Или просто моргает курсором в консоли и ничего не выводит?
Если последнее, то скорее всего просто ооочень долго считает из-за (как я уже сказал) нерационального алгоритма.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
20.11.2012, 19:52 | 31 | |||||
DevCPP это IDE. Из-за IDE такой проблемы не может быть.
Первая попавшая в голову реализация:
0
|
20.11.2012, 23:20 | 32 |
Что, за дурака что ли держишь? Я собственными руками делал и глазами видел, что адреса двух глобальных переменных оказались равны. MSVS себе такого не позволяет!
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
21.11.2012, 06:13 | 33 | |||||
Kuzia domovenok, Вы о чем вообще? Что MSVS, что DevCPP - IDE. Они не компилируют файлы. В поставке с DevCPP идет GCC, в MSVS - microsoft compiler. А IDE всего лишь позволяет удобно редактировать текст исходных файлов. С DevCPP, скорей всего, идет старая версия GCC. Но, похоже, у Вас одного "две переменные расположены по одному адресу".
А теперь вместо глобального массива int mask[ 10 ]; Попробуйте использовать std::vector mask( 10, 0 );. И каждое обращение замените с mask[ index ] на mask.at( index ). Вы получите исключение out of range, что подтверждает факт выхода за пределы. И расположен он вот в этом кусочке:
0
|
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
|
21.11.2012, 06:36 [ТС] | 34 |
Кузя, просто моргает курсором и ничего не выводит. Не может же он так долго считать? Я его 2 часа открытым держал. Я думаю этого времени достаточно чтобы просчитать. А он просто моргает.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
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
|
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
|
21.11.2012, 09:46 [ТС] | 36 |
Я использую компилятор Visual c++ 6.0 Почему то он у меня не понимает тип unsigned long long. Может попорбовать unsigned long long int? Этот тоже помоему не поймёт, дома вечером проверю. и Ещё ull надо без пробела приписывать слитно с числом?
Можно показать как он приписывается в моём коде если можно? Спасибо.
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
21.11.2012, 09:52 | 37 |
Да, слитно. 9876543210ull.
Тогда Вам не решить данную задачу Вашим способом. Эта версия студии не поддерживает новый стандарт, в котором введен тип long long. PS: я просмотрел полностью Ваш код. В нем очень много ошибок, все их перечислять не буду, вот некоторые: Не сбрасываете значение flag при проверке нового числа. Не обнуляете r при проверке нового числа, из-за чего выходите за пределы массива уже на втором числе. Оператор break относится только к ближайшему циклу или оператору switch. Поэтому будет прерван только цикл for (int y=x+1; y<10; y++) Оператор continue в конце ни к чему. И так можно долго.
0
|
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
|
24.11.2012, 14:38 [ТС] | 38 |
Тошкарик, спасибо за помощь! Я конечно понимаю, что я чайник в программировании и пока только учусь, ну вот насчёт "так можно долго.." я конечно не согласен))), кроме обнуления r и flag, там больше практически ошибок не было, что я уже сделал. Continue даже если и не нужен, по крайней мере не мешает)).
Ладно, спасибо большое в любом случае. Подскажите пожалуйста какой компилятор лучше всего использовать для таких программ? Спасибо.
0
|
14 / 2 / 0
Регистрация: 18.11.2011
Сообщений: 90
|
||||||
26.11.2012, 19:46 [ТС] | 40 | |||||
Я так думаю MSVS это Microsoft Visual Studio верно?
Я скачал с сайта Майкрософт Microsoft Visual C++ 2010 Express Edition. И также программа не работает, просто мигает курсором. Код финальный после всех исправлений. Блин запарился с этим кодом. Что делать чтобы работал и ull Добавил и long long поставил. Что тут не так?
0
|
26.11.2012, 19:46 | |
26.11.2012, 19:46 | |
Помогаю со студенческими работами здесь
40
В данном натуральном числе переставить цифры таким образом, чтобы получилось наименьшее число записанное этими же цифрами В данном натуральном числе переставить цифры таким образом, чтобы образовалось наименьшее число, записанное этими цифрами В данном натуральном числе переставить цифры таким образом, чтобы образовалось наибольшее число, записанное этими же цифрами. В длинном числе изменить только одну цифру так, чтобы новое число делилось на 9 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |