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

Работа с числами в с++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Andrey_1
0 / 0 / 0
Регистрация: 26.12.2010
Сообщений: 3
03.01.2011, 19:31     Работа с числами в с++ #1
не понимаю, как решить эту задачу.. бился день и ночь(
помогите пожалуйста

Вводится некоторое натуральное число N, состоящее не более чем из 10 различных цифр
(первая цифра - не 0). Определить, сколько существует различных чисел, больших N и
составленных из тех же цифр (и в тех же количествах), что и N.
Например, для числа 315 таких чисел 3. Эти числа: 351, 513 и 531.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2011, 19:31     Работа с числами в с++
Посмотрите здесь:

Работа с 16-ричными числами C++
Работа с числами C++
Работа с числами C++
C++ работа с числами
Работа с длинными числами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Гамбит
13 / 13 / 1
Регистрация: 19.10.2009
Сообщений: 93
03.01.2011, 19:37     Работа с числами в с++ #2
Просто найдите все перестановки из этих элементов и сравнивайте с исходным числом
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
03.01.2011, 22:50     Работа с числами в с++ #3
Цитата Сообщение от Andrey_1 Посмотреть сообщение
Вводится некоторое натуральное число N, состоящее не более чем из 10 различных цифр
(первая цифра - не 0). Определить, сколько существует различных чисел, больших N и
составленных из тех же цифр (и в тех же количествах), что и N.
Например, для числа 315 таких чисел 3. Эти числа: 351, 513 и 531.
Это из олимпиадных задачек.
Тут в принципе не очень сложно. Нужно помнить что число всех перестановок из из N различных цифр равно N!
А теперь сам алгоритм. Например дано число:
4679831
Подсчет начинаем так с первой цифры (в данном случае это 4):
1. Больше четверки цифры: 6, 7, 9, 8. Если первой стоит 6-ка, то кол-во перестановок для этого варианта (N-1)! . То же самое кол-во перестановок для варианта когда стоит первой 7, 9, 8. Всего (N-1!)*4
2. Теперь считаем что на первом месте стоит 4-ка (4-ку вообще выкидываем из дальнейшего алгоритма). Больше второй цифры (6-ки) только 7, 9, 8. Когда второй стоит 7-ка, то кол-во перестановок (N-2)! . То же самое кол-во перестановок для варианта когда стоит второй 9, 8. Добавляем к имеющемуся кол-ву (N-2!)*3.
и т.д.
В общем для числа 4679831 ответ будет:
(6!)*4+(5!)*3+(4!)*2
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.01.2011, 22:57     Работа с числами в с++ #4
valeriikozlov,
Больше четверки цифры: 6, 7, 9, 8
А пятерка где? оО
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
03.01.2011, 22:58     Работа с числами в с++ #5
ForEveR,
Пример приведен для числа: 4679831, в котором нет пятерки.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.01.2011, 22:59     Работа с числами в с++ #6
valeriikozlov, ПРошу прощения. Ступил.
Гамбит
13 / 13 / 1
Регистрация: 19.10.2009
Сообщений: 93
04.01.2011, 00:02     Работа с числами в с++ #7
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Это из олимпиадных задачек.
Тут в принципе не очень сложно. Нужно помнить что число всех перестановок из из N различных цифр равно N!
А теперь сам алгоритм. Например дано число:
4679831
Подсчет начинаем так с первой цифры (в данном случае это 4):
1. Больше четверки цифры: 6, 7, 9, 8. Если первой стоит 6-ка, то кол-во перестановок для этого варианта (N-1)! . То же самое кол-во перестановок для варианта когда стоит первой 7, 9, 8. Всего (N-1!)*4
2. Теперь считаем что на первом месте стоит 4-ка (4-ку вообще выкидываем из дальнейшего алгоритма). Больше второй цифры (6-ки) только 7, 9, 8. Когда второй стоит 7-ка, то кол-во перестановок (N-2)! . То же самое кол-во перестановок для варианта когда стоит второй 9, 8. Добавляем к имеющемуся кол-ву (N-2!)*3.
и т.д.
В общем для числа 4679831 ответ будет:
(6!)*4+(5!)*3+(4!)*2
хм..ну да, это быстрее чем мой метод=)
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
04.01.2011, 00:18     Работа с числами в с++ #8
Вот, вроде работает
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <algorithm>
#include <sstream>
#include <iterator>
#include <string>
#include <vector>
 
 bool cheking(int N)
{
    std::ostringstream ost;
    ost << N;
    std::string num_str = ost.str();
 
    bool key;
    std::string::iterator it, _it;
    size_t cnt = 0;
 
    for(it = num_str.begin(); it != num_str.end(); ++it)
    {
        key = true;
        for(_it = num_str.begin(); _it != num_str.end(); ++_it)
            if(it != _it && *it == *_it)
                key = false;
 
        if(key)
            ++cnt;
    }
 
    return cnt <= 10;
}
 
int main()
{
    int N, _N;
    std::cout << "\n\nN -> ";
    std::cin >> N;
 
     size_t cnt = 0;
    if(cheking(N))
    {
        _N = N;
        std::vector<int> vec;
        while(N)
        {
             vec.push_back(N % 10);
             N /= 10;
        }
 
        int num;
        std::sort(vec.begin(), vec.end());
        do
       {
           num = 0;
           for(size_t i = 0; i < vec.size(); ++i)
           {
               num += vec[i];
               num *= 10;
           }
           num /= 10;
           if(num > _N)
              ++cnt;
        }while(std::next_permutation(vec.begin(), vec.end()));
      }
      
      else
      {
          std::cerr << "Input error" << std::endl;
          return 1;
      }
 
    std::cout << "\n\nResult -> " << cnt << std::endl;
    return 0;
}
Andrey_1
0 / 0 / 0
Регистрация: 26.12.2010
Сообщений: 3
04.01.2011, 01:18  [ТС]     Работа с числами в с++ #9
огромное вам спасибо!!!!!)))
а можно что нибудб попроще?(
я в этом ни в зуб ногой(
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
04.01.2011, 01:34     Работа с числами в с++ #10
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
#include <iostream>
#include <windows.h>
 
using namespace std;
int fact(int a)
{
    int y=1;
    for(int i=1; i<=a; i++)
        y*=i;
    return y;
}
 
int main ()
{
    int a[10]={0}, N, b[10], i_b=0, i, j, res=0;
    cin>>N;
    while(N)
    {
        b[i_b++]=N%10;
        a[N%10]++;
        N/=10;
    }
    for(i=i_b-1; i>=0; i--)
    {
        for(j=9; j>b[i]; j--)
            if(a[j])
                res+=fact(i);
        a[b[i]]--;
    }
    cout<<res;    
    return 0; 
}
Andrey_1
0 / 0 / 0
Регистрация: 26.12.2010
Сообщений: 3
04.01.2011, 10:21  [ТС]     Работа с числами в с++ #11
огромное спасибо!)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2011, 11:04     Работа с числами в с++
Еще ссылки по теме:

работа с числами C++
Работа с числами C++
C++ функции работа с числами

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,669
04.01.2011, 11:04     Работа с числами в с++ #12
В моей программе можно вводить любые цифры (не обязательно различные) в количестве не более 10 (не считая начальных нулей).

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//////////////////////////////////////////////////////////////////////////////////////
//Вводится некоторое натуральное число N, состоящее не более чем из 10 различных цифр
//(первая цифра - не 0). Определить, сколько существует различных чисел, больших N и
//составленных из тех же цифр (и в тех же количествах), что и N.
//Например, для числа 315 таких чисел 3. Эти числа: 351, 513 и 531. 
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
//////////////////////////////////////////////////////////////////////////////////////
typedef long long  T_int;
//////////////////////////////////////////////////////////////////////////////////////
const size_t  ARR_SIZE = 10;
char          char_arr[ARR_SIZE];
size_t        dig_count = 0;
//////////////////////////////////////////////////////////////////////////////////////
bool  num_to_arr(T_int  n)
{
    std::stringstream  sinout;
    sinout << n;
    dig_count = sinout.str().size();
    if(dig_count > ARR_SIZE) return  false;
    std::istream_iterator<char>  sinout_beg(sinout);
    std::istream_iterator<char>  sinout_end;
    std::copy(sinout_beg, sinout_end, char_arr);
    return  true;
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    T_int  n = 0;
    for(;;)
    {
        std::cout << std::endl
                  << "N = ";    
        if(!(std::cin >> n))
        {
            std::cout << "Incorrect number."
                      << std::endl;
            std::cin.clear();
            continue;
        }
        if(num_to_arr(n))
        {
            break;
        }
        else
        {
            std::cout << "Digits should be no more than "
                      << ARR_SIZE
                      << "."
                      << std::endl;              
        }    
    }
 
    size_t  counter = 0;
    while(std::next_permutation(char_arr, char_arr + dig_count))
    {
        ++counter;
    }
    std::cout << counter              
              << std::endl;    
}
Yandex
Объявления
04.01.2011, 11:04     Работа с числами в с++
Ответ Создать тему
Опции темы

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