Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
1

Соседние цифры в N значном числе

20.11.2014, 13:25. Просмотров 1024. Ответов 15
Метки нет (Все метки)


Для n-значных чисел печатать только те, цифры которых являются соседними в натуральном ряду.
Программа правильно работает только с 2х значиными натуральным числами
для 3х значных должна выводиться последовательность:
123
234
345
456
567
678
789
А для 4х значных
1112
1213
1314
1415
1516
1617
1718
1819
2122
2223
------
9596
9697
9798

или
1234
2345
3456
4567
5678
6789 ?
как надо доработать программу?
C++ (Qt)
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 <windows.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <iostream>
using namespace std;
//---------------------------------------------------------------------------
 
  void RazlozhenieNaCh(int number, int n, int *ch)
    {   int i;
    for (i = 0; i < n; i++)
    {
        ch[i] = number % 10;
 
        number /= 10;
    } }
  bool SosednieCh(int *ch, int n)
  {     bool result = false;
        int raz = 0;
        for (int i = 0; i < n-1; i++)
        {
            for (int y = i + 1; y < n; y++)
            {
             // if ((ch[i] != 0 & ch[y] != 0)& (abs(ch[i] - ch[y]) == 1))
                if ((ch[i] != 0 & ch[y] != 0)& (((ch[i] - ch[y]) > 0)&((ch[i] - ch[y]) == 1)))
                {
                        raz++;  //cout << raz<< endl<< endl;
                }
            }
        }
        if (raz == n - 1)
        {
          result = true;
        }
        return result;
  }
  //-------------------------
int main()
{
    int n, min, max, i, KolCh = 0, NeChet = 0, *ch, t;
    cout << "Kolichestvo znakov  n: "; cin >> n ;
    min = pow(10, n - 1);
    max = min * 10 - 1;
    ch = new int[n];
    t = GetTickCount();
    for (i = min; i <= max; i++)
    {
        RazlozhenieNaCh(i, n, ch);
        if (SosednieCh(ch, n) == true)
        {   KolCh++;
            if (i % 2 == 1)
            {
                NeChet++;
            }
 
                cout<<i<<endl;
        }
        //=====
    }
    t = GetTickCount() - t;
    cout<<endl<<endl;
    cout<<"  Vsego chisel : "<< KolCh <<endl;
    cout<<"  Ne chetnih : "<< NeChet <<endl;
    cout<<"  Chetnih : " << KolCh - NeChet <<endl;
    cout<<"  Vremya raboti v ms: "<< t  <<endl;
    getchar(); getchar();
    delete[] ch; return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2014, 13:25
Ответы с готовыми решениями:

Соседние цифры в числе
Необходимо составить функцию, которая проверяет, являются ли цифры в натуральном ряду в числе...

Соседние цифры в числе
Составить функцию, которая определяет, являются ли цифры в записи целого числа соседними в...

Сравнение цифр в n-значном числе
int x, y, n=99; for(int i = 0; i &lt;= n; i++) // проход по всем числам в интервале, включая границы...

Найти сумму цифр в 4-х значном числе
Пожалуйста помогите. С простенькой задачкой. Язык С. Задание: Вводится с клавиатуры 4-х значное...

15
Эксперт C
25450 / 15842 / 3388
Регистрация: 24.12.2010
Сообщений: 34,661
20.11.2014, 14:11 2
Mars74, А такие трехзначные, как 910 или 4-х значные 8910 - не подойдут?

Добавлено через 22 минуты
Да, у тебя программа заточена именно на "однозначные" цифры. И довольно не эффективна, т.к. ты перебираешь все возможные числа диапазона и их провереяшь. В то время как нужные числа можно генерировать "впрямую"
Так, для двузначных все можно сделать так
C++
1
for(i=1; i<9; i++) cout << 10*i + i+1;
Для n-значных чуток сложнее. Надо пройтись по всем делителям числа n вот таким циклом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(d=1; d<=n/2; d++) {
  if (n%d) continue;  // d не является делителем n
    // Тут надо генерировать подходящие "цифры" размера d
  for(i=0, m=1; i<d; i++) m*=10;  // m = 10 в степени d (вместо pow, не люблю я его)
  for(i=m/10; i<d; i++) {
     s = 0;  // Здесь будет сгенерированное число
     for(j=0, k=i; j < n/d; j++, k++) {
        if (k>=m) break;  // k имеет больше d знаков - неудача
        s = m*s + k;
     }
     if (j==n/d) cout <<s << endl; 
  }
}
Не проверял. Возможны ошибки. Попробуй сам довести до ума, о результатах доложишь

Добавлено через 3 минуты
Цитата Сообщение от Mars74 Посмотреть сообщение
А для 4х значных
ИМХО, пропустил 1011 и 9899
1
1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
21.11.2014, 15:42  [ТС] 3
я не правильно поняла условие. нуж
Цитата Сообщение от Байт Посмотреть сообщение
как 910 или 4-х значные 8910 - не подойдут?
они не подойдут т.к. 0 не натуральное...
но чтобы разница по модулю между всеми парами цифр в числе была равна = 1, то число подходит.... если число 125 то сравниваем |1 - 2| = 1, потом сравниваем |2 - 5| !=1. число 125 не подходит
0
Эксперт C
25450 / 15842 / 3388
Регистрация: 24.12.2010
Сообщений: 34,661
21.11.2014, 17:59 4
Цитата Сообщение от Mars74 Посмотреть сообщение
они не подойдут т.к. 0 не натуральное.
Но 10 - натуральное!
0
1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
21.11.2014, 18:07  [ТС] 5
само число 10 да, но если рассматривать его как цифры 1 и 0 то нет, так как диапазон натуральных чисел начинается с 1
0
Эксперт C
25450 / 15842 / 3388
Регистрация: 24.12.2010
Сообщений: 34,661
21.11.2014, 18:14 6
Mars74, Грамотно (и однозначно) сформулируйте условие. Тогда будет о чем говорить.
Цитата Сообщение от Mars74 Посмотреть сообщение
цифры которых являются соседними в натуральном ряду.
Что такое цифра, знаете?
0
1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
21.11.2014, 18:27  [ТС] 7
разумеется
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
21.11.2014, 18:28 8
Цитата Сообщение от Байт Посмотреть сообщение
Да, у тебя программа заточена именно на "однозначные" цифры.
Цифры не имеют значности, у них только ичность.
0
Эксперт C
25450 / 15842 / 3388
Регистрация: 24.12.2010
Сообщений: 34,661
21.11.2014, 18:38 9
Цитата Сообщение от Mars74 Посмотреть сообщение
разумеется
по формулировке задачи и приведенным примерам этого не скажешь...
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
21.11.2014, 18:42 10
Цитата Сообщение от Mars74 Посмотреть сообщение
1213
3 не соседствует с 1.

Добавлено через 36 секунд
Цитата Сообщение от Mars74 Посмотреть сообщение
1112
1 и 1 - это одно число, а не два соседних.
0
1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
21.11.2014, 19:11  [ТС] 11
Формулировка из задачника. относительно этой задачи удобнее допустить что, число состоит из цифр.
Если Вам удобнее другая формулировка то перефразирую.
Например число 125 состоит из 3х чисел 1,2,3.
сравниваем числа |1 - 2| = 1, потом сравниваем числа |2 - 5| !=1. число 125 не подходит
Если взмоем число 120, оно состоит из чисел 1,2,0. число 120 тоже не подходит.
0 - не является натуральным числом. Но если рассматривать число 120 "целиком" то оно будет натуральным.
Если взмоем число 654, оно состоит из чисел 6,5,4 разница между ними по модулю равна 1. число 654 подходит.

Добавлено через 10 минут
Эти последовательности не верны. Т.к. первоначально я не поняла как правильно сравнивать N значные числа.
Цитата Сообщение от Mars74 Посмотреть сообщение
123
234
345
456
567
678
789
А для 4х значных
1112
1213
1314
1415
1516
1617
1718
1819
2122
2223
------
9596
9697
9798
или
1234
2345
3456
4567
5678
6789 ?
+
для того чтобы программа корректно работала для 2 значных чисел надо закомментировать
Цитата Сообщение от Mars74 Посмотреть сообщение
if ((ch[i] != 0 & ch[y] != 0)& (((ch[i] - ch[y]) > 0)&((ch[i] - ch[y]) == 1)))
эту строку вместо верхней
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
21.11.2014, 19:18 12
Цитата Сообщение от Mars74 Посмотреть сообщение
Формулировка из задачника. относительно этой задачи удобнее допустить что, число состоит из цифр.
В натуральном ряду цифр нет, там только числа. Значит получается так: есть цифра, из неё одной составляем число, в искомом числе рядом стоит другая цифра, из неё одной тоже составляем число, два полученных однозначных числа должны быть соседними. То есть:
10
12
21
23
32
34
43
45
54
56
65
67
76
78
87
89
98
101
121
123
210
212
232
234
321
323
343
345
432
434
454
456
543
545
565
567
654
656
675
678
765
767
787
789
876
878
987
0
1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
21.11.2014, 20:37  [ТС] 13
Верно. только в этом ряду не должно быть чисел с 0. то есть:
Цитата Сообщение от taras atavin Посмотреть сообщение
101
Цитата Сообщение от taras atavin Посмотреть сообщение
210
Цитата Сообщение от taras atavin Посмотреть сообщение
10
Добавлено через 1 час 9 минут
Допустим я беру i-тое число из n значного диапазона.
Делю число на n составных элементов (элемент - однозначное число). функция
Цитата Сообщение от Mars74 Посмотреть сообщение
void RazlozhenieNaCh(int number, int n, int *ch)
потом просматриваю разности по модулю между 1 и 2 элементном числа ; 2 и 3 элементом числа и так до элемента n-1 и n. То есть в числе разрядностью n получается n-1 пар однозначных чисел сравниваемых между собой. Чтобы число подошло разность по модулю между элементами в паре =1 должна повториться n-1 раз, то есть для каждой пары. функция
Цитата Сообщение от Mars74 Посмотреть сообщение
bool SosednieCh(int *ch, int n)
.
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
22.11.2014, 06:06 14
Цитата Сообщение от Mars74 Посмотреть сообщение
Верно. только в этом ряду не должно быть чисел с 0. то есть:
Ну некоторые с ноля нумеруют. Например first flour - это по-русски второй этаж, а не первый, а под ним есть ещё один. Но first - это первый. Какой этаж под первым? Конечно же нулевой. Но если так понимать, то да.
0
1 / 1 / 0
Регистрация: 25.03.2013
Сообщений: 31
22.11.2014, 13:04  [ТС] 15
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну некоторые с ноля нумеруют
Однако в учебниках пишут что наименьшее натуральное число - 1 и именно с него начинается ряд натуральных чисел..
0
4197 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
22.11.2014, 13:12 16
В учебниках, изданных на русском. И я же не спорю. Хотите делать по-русски - делайте.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2014, 13:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Нахождение всех симметричных чисел в 4-х значном числе
Пример 1331,7667 Не понимаю с чего начать вообще программу, есть идея разбить на отдельные...

В n-значном числе определить максимальный элемент и его позицию
в n-значном числе определить максимальный элемент и его позицию

Неповторяющиеся цифры в случайном 4-х значном числе
Подобное не работает и пропускает числа с повторяющимися цифрами Random rand = new Random(); ...

В 4-х значном числе поменять цифры местами
Составить программу которая в 4-х значном числе меняет местами 1 и 2 цифры,3 и 4. Пример:1234=2143


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

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