С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
ropique
0 / 0 / 0
Регистрация: 14.07.2013
Сообщений: 106
1

Определение одинаковых цифрах, не используя массив)

21.07.2013, 21:02. Просмотров 1337. Ответов 30
Метки нет (Все метки)

Есть задачка. нужно определить, сколько цифр повторяются в двух четырезначных числах, и так же сколько из них стоят на месте) я знаю, как решать с помошью массива) но преподаватель запрешает ислользовать массив.. искала в гугле, там везде подобное предлогается с массивом))

Может кто подскажет алгоритм, как делать иначе?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2013, 21:02
Ответы с готовыми решениями:

Определение четности чисел в большом объеме данных, используя 10 потоков
Как такое можно решить? Мозги кипят, вижу что при помощи Мютекса, но как? есть...

Как перевести массив байт в массив символов, используя определённую кодировку?
Всем доброго времени суток, ув. форумчане! Делаю алгоритм LFSR, почти...

Есть ли возможность в char-массив часть данных ввести в буквах, а часть в цифрах?
подскажите пожалуйста, есть ли возможность в char массив часть данных ввести в...

Определение одинаковых символов
Очень прошу помощи! Понимаю, что задачка простая, но у меня проблема с работой...

Определение наличия одинаковых элементов масива
Здравствуйте, помогите определить есть ли в данном масиве одинаковые элементы....

30
Энтомолог
94 / 149 / 44
Регистрация: 25.04.2012
Сообщений: 2,397
21.07.2013, 21:25 2
Если задача в том, чтобы найти количество одинаковых цифр в десятичных записях двух четырехзачных чисел, т.е 1100 и 1010 выдают после сравнения 4 одинаковые цифры (1, 1, 0, 0), то ищите остаток целочисленного деления каждого числа на 10 в цикле - так вытащите по одной цифре из каждого числа за проход (это если разрешается сравнивать только цифры на одинковых позициях), иначе используйте кратные 10 делители, чтобы доставать цифры на разных позициях (использовать при этом целочисленное деление, циклы, поиск остатка от деления).
0
ropique
0 / 0 / 0
Регистрация: 14.07.2013
Сообщений: 106
21.07.2013, 21:37  [ТС] 3
Как я поняла, можно что-то такое:
C#
1
2
3
4
                d1 = NumberUser % 10; NumberUser /= 10;
                c1 = NumberUser % 10; NumberUser /= 10;
                b1 = NumberUser % 10; NumberUser /= 10;
                a1= NumberUser % 10;
и похожее для второго числа.. Но как потом сравнить и найти количество повторов и количество с одинаковыми позициями?
0
Энтомолог
94 / 149 / 44
Регистрация: 25.04.2012
Сообщений: 2,397
21.07.2013, 22:50 4
Задачу лучше разбить на две. Это код для определения повторов на одинаковых позициях.
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
static void Main()
        {
            const uint aConst = 1002;
            const uint bConst = 1100;
 
            byte repetitiveAtTheSamePositions = 0;
            uint a = aConst;
            uint b = bConst;
            for (int i = 0; i < 4; i++)
            {
                if
                    (
                        (a % 10)
                        ==
                        (b % 10)
                    )
                        repetitiveAtTheSamePositions++;
                a /= 10;
                b /= 10;
            }
 
            Console.WriteLine("Цифр, повторяющихся на одинаковых позициях, {0}", 
                repetitiveAtTheSamePositions);
 
            Console.ReadKey();
 
        }
Добавлено через 53 минуты
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System;
 
namespace помощь1
{
    class Program
    {
        private static readonly uint aConst = 1010;
        
        private static readonly uint bConst = 1010;
 
        private static void FirstTask()
        {
            try
            {
                byte repetitiveAtTheSamePositions = 0;
                uint a = aConst;
                uint b = bConst;
 
                for (int i = 0; i < 4; i++)
                {
                    if
                        (
                        (a % 10)
                        ==
                            (b % 10)
                        )
                        repetitiveAtTheSamePositions++;
 
                    a /= 10;
                    b /= 10;
                }
 
                Console.WriteLine("Цифр, повторяющихся на одинаковых позициях, {0}",
                    repetitiveAtTheSamePositions);
            }
            catch (Exception e)
            { Console.WriteLine(e.Message.ToString()); }            
        }
 
        private static void SecondTask()
        {
            try
            {
                byte theNumberOfRepeatingInVariousPositions = 0;
                uint a = aConst;
                uint b = bConst;
                
                uint aCopy = a;
                uint bCopy=b;
                for(int i=0;i<4;i++)
                {
                    uint c=(bCopy==10)?0
                                :(bCopy%10);
                    for(int J=0;J<4;J++)
                    {
                        uint d=(aCopy==10)?0
                                        :(aCopy % 10);
                        
                        if
                            (
                                d
                              ==
                            c
                              )
                        {
                            theNumberOfRepeatingInVariousPositions++;
                            Console.WriteLine("Встречается повтор цифры {0}\n", c);
                            
                        }
                        aCopy /= 10;
                   }
                    aCopy = a;
                        bCopy/=10;                        
                     
                    }
                
            }
            catch (Exception e)
            { Console.WriteLine(e.Message.ToString()); }
        }
 
        static void Main()
        {
            FirstTask();
 
            SecondTask();
 
            Console.ReadKey();
        }
    }
}
Здесь закодированы оба решения.
1
ropique
0 / 0 / 0
Регистрация: 14.07.2013
Сообщений: 106
21.07.2013, 23:07  [ТС] 5
Кстати, единственное не поняла, почему приносит 4 результатов?:-)
0
Энтомолог
94 / 149 / 44
Регистрация: 25.04.2012
Сообщений: 2,397
21.07.2013, 23:17 6
Исходя из логики конкретно этих 2 чисел - для каждой цифры второго числа существует два таких же в первом. Т.е. для каждой цифры второго числа первое считается ранее не рассматривавшимся, и все цифры, входящие в его запись, уникальны, даже если совпадают.
1
ropique
0 / 0 / 0
Регистрация: 14.07.2013
Сообщений: 106
21.07.2013, 23:34  [ТС] 7
аа, уже понятно)) а какой цикл можно еще добавить,что бы каждый раз, увидев повтор, он не сравнил его на следуйщем круге?

Добавлено через 9 минут
вот паралейно так же пробую с масивом писать)) но всегда цифры получаются больше))
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (i = 1; i <= 4; i++)
                    a[i] = NumberKomp % i;
                                for (j = 1; j <= 4; j++)
                    b[j] = NumberKomp % j;
                for (i = 0; i <4; i++)
                {
                    for (j = 0; j <4; j++)
                    {
                        if (a[i] == b[j])
                                                    ham++;
                            if (a[i]==b[j]&&(i == j)) poz++;
                        
                    }
                }
нечто такое)) как можно делать, что бы одно совпадение считалось всего один раз?
0
Энтомолог
94 / 149 / 44
Регистрация: 25.04.2012
Сообщений: 2,397
21.07.2013, 23:43 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System;
 
namespace помощь1
{
    class Program
    {
        private static readonly uint aConst = 1111;
 
        private static readonly uint bConst = 1310;
 
        private static void FirstTask()
        {
            try
            {
                byte repetitiveAtTheSamePositions = 0;
                uint a = aConst;
                uint b = bConst;
 
                for (int i = 0; i < 4; i++)
                {
                    if
                        (
                        (a % 10)
                        ==
                            (b % 10)
                        )
                        repetitiveAtTheSamePositions++;
 
                    a /= 10;
                    b /= 10;
                }
 
                Console.WriteLine("Цифр, повторяющихся на одинаковых позициях, {0}",
                    repetitiveAtTheSamePositions);
            }
            catch (Exception e)
            { Console.WriteLine(e.Message.ToString()); }
        }
 
        private static void SecondTask()
        {
            try
            {
                
                uint a = aConst;
                uint b = bConst;
                uint save = 1;
 
                uint aCopy = a;
                uint bCopy = b;
                for (int i = 0; i < 4; i++)
                {
                    uint c = (bCopy == 10) ? 0
                                : (bCopy % 10);
                    for (int J = 0; J < 4; J++)
                    {
                        uint d = (aCopy == 10) ? 0
                                        : (aCopy % 10);
 
                        if
                            (
                                d
                              ==
                            c
                              )
                        {
                            bool flag = false;
                            uint saveCopy = save;
                            while (saveCopy>=10)
                            {
                                uint e = saveCopy % 10;
                                if (e == c) 
                                    flag = true;
                                saveCopy /= 10;
                            }
                            if (!flag)
                            {
                                Console.WriteLine("Встречается повтор цифры {0}\n", c);
                                save = save * 10 + c;
                            }
                        }
                        aCopy /= 10;
                    }
                    aCopy = a;
                    bCopy /= 10;
 
                }
 
            }
            catch (Exception e)
            { Console.WriteLine(e.Message.ToString()); }
        }
 
        static void Main()
        {
            FirstTask();
 
            SecondTask();
 
            Console.ReadKey();
        }
    }
}
1
ropique
0 / 0 / 0
Регистрация: 14.07.2013
Сообщений: 106
22.07.2013, 00:02  [ТС] 9
че-то снова не то делает, но все равно спасибо:-)) все же лучше массивом делать((
0
umc55555
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 226
22.07.2013, 00:45 10
Цитата Сообщение от ropique Посмотреть сообщение
все же лучше массивом делать
С помощью ассоциативного массива - просто, быстро и понятно.
0
ropique
0 / 0 / 0
Регистрация: 14.07.2013
Сообщений: 106
22.07.2013, 00:48  [ТС] 11
Цитата Сообщение от umc55555 Посмотреть сообщение
С помощью ассоциативного массива - просто, быстро и понятно.
да.. осталось делать так, что бы прога не считала повторы) а если видит одинаковые элементы, считала как одно совпадение(((
0
Энтомолог
94 / 149 / 44
Регистрация: 25.04.2012
Сообщений: 2,397
22.07.2013, 10:03 12
А что не так в моем решении ?
0
ropique
0 / 0 / 0
Регистрация: 14.07.2013
Сообщений: 106
22.07.2013, 12:40  [ТС] 13
Цитата Сообщение от Alex9 Посмотреть сообщение
А что не так в моем решении ?
я пробовала ввести другие числа, вместо двух ответов дается больше двух ответов..
0
umc55555
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 226
22.07.2013, 13:22 14
C#
1
2
3
4
5
6
7
8
int[] NumbersArray;
SortedDictionary<int,int> NumbersCounts = new SortedDictionary<int,int>();
 
for (int i = 0; i < NumbersArray.Length; i++)
       if (!NumbersCounts.ContainsKey(NumbersArray[i])) // если ассоциативный не содержит число
              NumbersCounts.Add(NumbersArray[i], 1); // добавить его. счетчик = 1
       else
              NumbersCounts[NumbersArray[i]]++; // иначе увеличить счетчик на 1
SortedDictionary - коллекция пар ключ/значение, упорядоченных по ключу (автоматически сортируются то есть).
Ключ ассоциативного массива (в данном случае) - ваше число из массива чисел NumbersArray.
Значение элемента ассоциативного - счетчик; количество раз, которое это число встретилось.
Если попытаетесь добавить в ассоциативный массив ключ, который является уже существующим числом в этом массиве, то выбросится исключение. То есть не может быть двух одинаковых ключей; в вашем случае - не может быть двух одинаковых чисел. Поэтому повторы там в принципе невозможны.

Вывод в файл у меня реализован, поэтому просто копирнул.
Вывод ассоциативного:
C#
1
2
3
4
5
6
bool isAppend = false; // нужно ли перезаписывать файл, или добавить к нему строки
StreamWriter streamWriter = new StreamWriter(PathToTxt, isAppend);
streamWriter.Write("Неповторяющиеся числа / их количество (k / N_k):\r\n\r\n");
 
foreach (var pair in NumbersCounts)
    streamWriter.Write(pair.Key + " / " + pair.Value + "\r\n");
P. S. Пока писал вам ответ, нашел ошибку в своем этом алгоритме подсчета цифр, которую не знал где вообще искать. Спасибо : ).

P. P. S.
Цитата Сообщение от Alex9 Посмотреть сообщение
А что не так в моем решении?
Сравните алгоритмы. У меня 5 строчек - цикл и условный оператор, а у вас.. много чего).
1
Энтомолог
94 / 149 / 44
Регистрация: 25.04.2012
Сообщений: 2,397
22.07.2013, 13:59 15
Сравните алгоритмы - у меня не использованы массивы.

Добавлено через 3 минуты
Цитата Сообщение от ropique Посмотреть сообщение
я пробовала ввести другие числа, вместо двух ответов дается больше двух ответов..
Какие это были числа ?
0
umc55555
14 / 14 / 7
Регистрация: 11.05.2013
Сообщений: 226
22.07.2013, 14:22 16
Цитата Сообщение от Alex9 Посмотреть сообщение
не использованы массивы
Да, только...
Цитата Сообщение от ropique Посмотреть сообщение
все же лучше массивом делать
0
sithy
16 / 16 / 4
Регистрация: 17.10.2012
Сообщений: 73
22.07.2013, 17:10 17
а если вот так?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int OneNum = 2538;
            int TwoNum = 1583;
 
            string OneStrNum = OneNum.ToString();
            string TwoStrNum = TwoNum.ToString();
 
            byte RtrvCount = 0;//число общих цифр
            byte CnslsCount = 0;//число совпадений по позиции
 
            for (int i = 0; i < OneStrNum.Length; i++)
                if (OneStrNum[i] == TwoStrNum[i]) CnslsCount++;
 
            foreach (Char Item in OneStrNum)
                foreach (char Item2 in TwoStrNum)
                    if (Item == Item2) RtrvCount++;
            Console.WriteLine("одинаковых цифр в двух числах "+RtrvCount);
            Console.WriteLine("совпадений по позиции "+CnslsCount);
            Console.ReadKey();
0
Энтомолог
94 / 149 / 44
Регистрация: 25.04.2012
Сообщений: 2,397
22.07.2013, 19:11 18
Строка в шарпе - это массив.
0
sithy
16 / 16 / 4
Регистрация: 17.10.2012
Сообщений: 73
22.07.2013, 19:22 19
Цитирую Шилдта: "В целом ряде других языков программирования строка представляет собой массив символов. А в C# строки являются объектами".
0
Psilon
Master of Orion
Эксперт .NET
6013 / 4866 / 902
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
22.07.2013, 20:12 20
sithy, массив в языке C# является объектом. Не вижу неувязки в логической цепочке
строка -> массив -> объект.


sithy, вы заказчику объясните, что его ТЗ хрень и вы-то точно знаете, что ему нужно. Мне даже любопытно.

Добавлено через 52 секунды

Не по теме:

Отвечал на два сомнительных поста, оба оказались от одного автора. Есть повод задуматься

0
22.07.2013, 20:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2013, 20:12

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

Определение количество слов содержащих три одинаковых букв
Дан текст. Определить количество слов, которые содержат три буквы е. с++...

Определение количества одинаковых пар чисел в числовом ряде
Определение количество одинаковых пар чисел в числовом рядя ?


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

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

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