Консультация № 99271
22.08.2007, 14:09
0.00 руб.
0 5 5
Помогите пожалуйста. Никак не пойму как сделать эту прогу:

Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность (например, 1234, 5789).

Обсуждение

Неизвестный
22.08.2007, 16:19
общий
это ответ
Здравствуйте, Ренат !

Вам нужно использовать рекурсию. Задача изначально кажется сложной, но решение оказалось довольно коротким (см. приложение).

Я назвал проект Naturalе. Откомпилировав его при помощи Visual C++ 6, получил запускаемую программу Naturale.exe. Вывод программы на экран не умещается, поэтому я запустил её (в командной строке) так:

Naturale.exe > Naturale.txt

Такой запуск перенаправил вывод программы в файл Naturale.txt, который я затем просмотрел (можно использовать блокнот, если у Вас не найдётся ничего более удобного).
Программа вроде-бы достаточно проста для понимания, но если захотите что-то уточнить, спрашивайте.

Приложение:
#include "stdafx.h"#include "iostream.h"void Natural(unsigned int param){ cout << param <<endl; unsigned int p = param % 10; if (p < 9) { for (int i = p + 1; i <= 9; i++) Natural(param * 10 + i); }}int main(int argc, char* argv[]){ for (int i = 1; i <= 9; i++) Natural(i); return 0;}
Неизвестный
22.08.2007, 16:22
общий
это ответ
Здравствуйте, Ренат !
Мой Вам совет просто порезать n-значное число на цифры и каждая следующая по старшенству разряда должна меньше на 1.
Наиболее простой вариант использовать рекурсию.
Неизвестный
22.08.2007, 16:31
общий
это ответ
Здравствуйте, Ренат !
Вот вам решение, правда простой перебор, но тоже вариант :)

Приложение:
bool f(int x);int _tmain(int argc, _TCHAR* argv[]){ int n=0; cin >> n; int x1 = pow(10.0,(n-1)); int x2 = pow(10.0,n); for (int i = x1; i<x2; i++){ if (f(i)) cout << i << ‘ ‘; } char _a_ = _getch(); return 0;}bool f(int x){ /* функция проверяет возрастающую последовательность цифр в числе*/ int n1=0,n2=10; while (x > 0){ n1 = x % 10; x /= 10; if (n2<=n1) return false; n2 = n1; } return true;}
Неизвестный
22.08.2007, 16:53
общий
это ответ
Здравствуйте, Ренат !

Если посмотреть внимательно на эту формулу, то можно увидеть, что количество таких натуральных чисел ограничено:

разряды: числа:
1 нет
2 12 23 34 45 56 67 78 89 - 8 чисел
3 123 234 345 456 567 678 789 - 7 чисел
..
9 123456789 - 1 число
10 таких чисел опять нет

Так что исходя из этой формулы, можно реализовать пррограмму, которая будет в зависимости от разрядности числа выводить 10-n n-разрядных чисел. Код в приложении


Приложение:
#include <iostream>using namespace std;int main(){ int digit; printf("Enter digit "); scanf("%d",&digit); // если введено неправильно число разрядов if(digit<2 || digit>9) { cout<<"Wrong digit\n"; return 1; } // распечатываем числа else { for(int i=0;i<10-digit;i++) { for(int j=1;j<digit+1;j++) cout<<j+i; cout<<‘\n‘; } } return 0;}
Неизвестный
23.08.2007, 03:44
общий
это ответ
Здравствуйте, Ренат !
Ваша задача в общем случае решается простым поиском подстрок в строке упорядоченных символов. В моем примере это цифры десятиричной системы. Можно, например, расширить ее до шестнадцатиричной (123456789ABCDEF). Задача решается безо всяких рекурсий и замысловатых вычислений...

Приложение:
#include <string>#include <iostream>using namespace std;int main(int argc, char* argv[]) { string symbols = "123456789"; int n = static_cast<int>(symbols.length()); for(int i=1; i<=n; i++) for(int j=0; j<=n-i; j++) cout << symbols.substr(j, i) << endl; return 0;}
Форма ответа