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

Как поменять цифры в числе местами? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.71
nezu
Сообщений: n/a
09.10.2011, 19:52     Как поменять цифры в числе местами? #1
Помогите, пожалуйста, с задачей
Нам дано: натуральное число, запись которого начинается не с нуля и содержит не больше 100 цифр.
задача: вывести число, состоящее из цифр входного числа и делящееся на 6(если числа не существует,вывести -1)
Что у меня уже есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
main() 
{
 int n1, n2;
 cout<<"vvedite chislo:";
 cin>>n1;
 if ((n1%3)>0) cout<<"-1"; 
 else
 {
     n2=0
     while ((n1%2)!=0)
     {
           n1=n1/10;
           n2++;
     }
т.е. я знаю которую по счёту цифру мне надо переставить в конец числа, но не знаю как это сделать
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
09.10.2011, 20:06     Как поменять цифры в числе местами? #2
Наверное вам надо составить массив из цифр и занести в него значения в соответсвии с вашим алгоритмом в цимкле while. Затем поменять в массиве требуемые цифры местами и из них составить новое число.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
09.10.2011, 22:47     Как поменять цифры в числе местами? #3
Цитата Сообщение от nezu Посмотреть сообщение
.е. я знаю которую по счёту цифру мне надо переставить в конец числа, но не знаю как это сделать
Ну раз значешь, вот код написал по-индексу чисел указываешь какую цифру перенести назад.
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 <stdio.h>
#include <math.h>
 
int n_back(int i, int num) {
   int n = int(pow(10, int(log10(num))));
   int b, tmp, k;
   int mk = 0, dec = n / 10;
   for(k = 1; n > 0; k++, n /= 10) {
         b = num / n % 10;
         if(k != i) {
              mk  += b * dec;
              dec /= 10;
         } else
              tmp  = b;
   }
   return  mk * 10 + tmp;
}
 
int main() {
 
   // перенести с первой позиции назад
   int num = 23;
   printf("%d\n%d\n\n",  num, n_back(1, num) );  
 
   // перенести со второй позиции назад
   num = 345;
   printf("%d\n%d\n\n",  num, n_back(2, num) );
    
  // 3 ...
  num = 1573;
  printf("%d\n%d\n\n",  num, n_back(3, num) );
    
  // 2 ...
   num = 1357;
   printf("%d\n%d\n\n",  num, n_back(2, num) );
 
    getchar();
    return 0;
}
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
10.10.2011, 13:19     Как поменять цифры в числе местами? #4
Чтобы число делилось на 6 нужно чтобы оно делилось на 3 и на 2
Чтобы число делилось на 2 нужно чтобы последняя цифра была четная

Поэтому находим четную цифру в числе и переставляем назад
Если четных цифр нет - значит число не делится на 6 никак

Чтобы число делилось на 3 нужно чтобы сумма цифр числа тоже делилась на 3
Поэтому нужно составить новое число из цифр числа
чтобы сумма цифр делилась на 3
и при этом не трогать последнюю четную цифру

Добавлено через 5 минут
Последнее четная цифра при делении на 3 дает в остатке 0 или 1 или 2

Пусть d - последняя четная цифра
Вариант 1) d == 0
Вариант 2) d == 2, d == 8
Вариант 3) d == 4
Вариант 4) d == 6

Добавлено через 4 минуты
Если d == 6, то сразу вернем ответ задачи "6"
Это число делится на 6
Остается три варианта
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.10.2011, 13:58     Как поменять цифры в числе местами? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Так как-то
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
#include <iostream>
#include <sstream>
#include <algorithm>
 
int main()
{
    std::string str;
    std::cin >> str;
    int sum = 0;
    
    for (int i = 0; i < (int) str.size() ; ++i)
        sum += str[i] - '0';
    
    for ( int i = (int) str.size() - 2; ( str[str.size() - 1] - '0' ) % 2 != 0 and i >= 0 ; --i)
        if ( (str[i] - '0') % 2 == 0 )
            std::swap( str[i], str[str.size() - 1] );
    
    if ( sum % 3 != 0 or (str[str.size() - 1] - '0') % 2 != 0)
    {
        std::cout << -1;
        return 0;
    }
    
    std::cout << str;
}
-=ЮрА=-
Заблокирован
Автор FAQ
10.10.2011, 14:03     Как поменять цифры в числе местами? #6
Вот мой вгляд на проблемму. Сущность алгоритма такова - разбили число на разряды и занесли их в массив, а затем выводим сочетания из цифр разрядов
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
#include <iostream>
#include <conio.h>
using namespace std;
 
int SplitNum(int val, int * arr)
{
    int n = 0;
    do
    {
        arr[n] = val % 10;
        n++;
    }
    while(0 < (val /= 10));
    return n;//Возвратим число цифр в числе
}
 
int GetNum(int beg, int end, int n, int * arr)
{
    //beg - с какого начинать
    //end - какое делать последним
    int ret = arr[beg];
        if(ret == 0)
        ret = 1;
    for(int i = beg + 1; i < n; i++)
    {
        if(i != end)
        {
            ret *= 10;
            ret += arr[i];
        }
    }
    for(i = 0; i < beg; i++)
    {
        if(i != end)
        {
            ret *= 10;
            ret += arr[i];
        }
    }
    ret *= 10;
    ret += arr[end];
    return ret;
}
 
int main()
{
    int arr[100];//Буффер под циифры числа
    int val;
    int i,j,n;//Содержит в себе кол-во разрядов числа
    do
    {
        std::cout<<"Enter number : ";std::cin>>val;
        std::cout<<"\tGenerated numbers\n";
        
        n = SplitNum(val, arr);
        for(i = 0;     i < n; i++)
        for(j = i + 1; j < n; j++)
        {
            std::cout<<(val = GetNum(j, i, n, arr))<<" ";
            if(val % 6 == 0)
                std::cout<<" % 6 == 0!";
            std::cout<<"\n";
        }
        std::cout<<"Press Y for new input\n";
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
Скрывать не буду писал и тестировал быстро поэтому если будут баги пишем в топик...
Миниатюры
Как поменять цифры в числе местами?  
Yandex
Объявления
10.10.2011, 14:03     Как поменять цифры в числе местами?
Ответ Создать тему
Опции темы

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