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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.71
nezu
Сообщений: n/a
#1

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

09.10.2011, 19:52. Просмотров 4161. Ответов 5
Метки нет (Все метки)

Помогите, пожалуйста, с задачей
Нам дано: натуральное число, запись которого начинается не с нуля и содержит не больше 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2011, 19:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как поменять цифры в числе местами? (C++):

Поменять цифры в числе местами - C++
салам!) помогите решить одну задачу, нужно вывести число цифрами наоборот. например: вводотся 45-выводится 54 НО если вводится 20 или...

В числе поменять местами цифры - C++
Дано число ABCDEF.GHIKLM(в котором буквы – это любые цифры (0..9)) в этом числе поменять местами E – H и C – L

В трехзначном числе поменять местами первую и последнюю цифры - C++
Условие: разработать функцию которая в трехзначном числе меняет местами первую и последнию цифру с++ Разработал функцию, но вот что в...

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

Поменять в числе первую и вторую цифры - C++
3) Дано трёхзначное целое число А. Поменять в этом числе первую и вторую цифры.

Поменять первую и последнюю цифры в числе. - C++
Нужна помощь в решение задачи. Дано число n. Как поменять первую и последнюю цифры.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Сыроежка
Заблокирован
09.10.2011, 20:06 #2
Наверное вам надо составить массив из цифр и занести в него значения в соответсвии с вашим алгоритмом в цимкле while. Затем поменять в массиве требуемые цифры местами и из них составить новое число.
xAtom
914 / 739 / 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
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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
1929 / 1195 / 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;
}
Скрывать не буду писал и тестировал быстро поэтому если будут баги пишем в топик...
Миниатюры
Как поменять цифры в числе местами?  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2011, 14:03
Привет! Вот еще темы с ответами:

Переставить местами вторую и третью цифры в трёхзначном числе - C++
Дано трехзначное число. Переставить местами вторую и третью цифры в числе. Помогите составить программу. В этой задаче вообще не знаю...

Поменять местами первую и последнюю цифру в числе - C++
Здравствуйте, я в C++ новичок и мне очень нужна помощь. Дано некое число, которое вбивает пользователь, надо поменять в этом числе первую и...

В числе 15 поменять местами младший и старший байты - C++
Здравствуйте всем объясните пожалуйста как например в числе 15 поменять местами младший и старший байты (Я Си изучаю только два дня) ...

В массиве из 10 числе поменять местами минимальный и максимальный элементы - C++
Привет. НУждаюсь в ваше помощи. Нужно написать программу в С. В массиве из 10 числе поменять местами минимальный и максимальный...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.10.2011, 14:03
Ответ Создать тему
Опции темы

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