Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
1

За 3 взвешивания на весах найти из 25 монет фальшивую

18.02.2016, 19:45. Показов 3977. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем здравия, на этом форуме была задача, за 3 взвешивания на весах найти из 25 монет, фальшивую.
Написал программу, все работает. Но так как я учусь самостоятельно, прошу подсказать, какой теме мне нужно уделять больше внимание. Понимаю, что программа очень-очень далека от совершенства, но хочется получить отметку с комментарием.
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//  Переделанная задача из моего детства, было: найти фальшивую монету из 9, двумя взвешиваниями
// Сегодня на форуме появилась задача: найти фальшивую монету из 25, тремя взвешиваниями.
//  
//
 
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
 
int test1(int step1[], int step2[], int size);
int test2(int dev1[],int size);
int test3(int last[]);
int test3_1(int, int);
int sum1, sum2, sum3, sum4, sum5, a;
int part1[8], part2[8], part3[8];
int part4[3], part5[3];
unsigned int x = 0;           // это чило укажет на номер фальшивой монеты
int main()
{
    setlocale(0, "");
    srand(time(0));
    int all[25];
    int gr = 8;       //для деления на группы
    int count = 0;
    for (int i = 0; i < 25; i++)
        all[i] = 1;
    all[rand() % 25] = 0;     //присвоили случайному элементу массива 0, теперь будем его искать
    // 25 монет делим по 8 монет (последняя пусть подождет)
    //int part1[8], part2[8], part3[8];
    for (int i = 0; i < 25; i++)
    {
        if (count == 8)
            count = 0;
 
        if (i<gr)
            part1[count++] = all[i];   // первая партия для взвешевания
        
 
        if (i >= gr && i < (2 * gr))   // вторая партия для взвешевания
            part2[count++] = all[i];
        
        if (i >= (2 * gr) && i < (3 * gr))  // третья партия для взвешевания
            part3[count++] = all[i];
    
    }
    
    // Последующие 3 цикла -for- только для вывода в консоль что, где находится.
    for (int i = 0; i < 8; i++)
        cout << part1[i] << ' ';
    cout << endl;
    for (int n = 0; n < 8; n++)
        cout << part2[n] << ' ';
    cout << endl;
    for (int m = 0; m < 8; m++)
        cout << part3[m] << ' ';
 
    cout << endl;
    for (int i = 0; i < 25; i++)   // Этот цикл вывода всех монет, на случай если фальшивая окажется 25 монетой.
        cout << all[i] << ' ';
    cout << endl;
    test1(part1, part2, gr); // Эта функция произведет взвешевание первой и второй партии
 
    cout << " Фальшивая монета оказалась " << x << endl << endl;
    system("pause");
    return 0;
}
int test1(int step1[],int step2[], int size)   // первое взвешевание
{
    for (int i = 0; i < size; i++)   // суммируем первую партию
        sum1 += step1[i];
    cout << sum1 << endl;
    for (int i = 0; i < size; i++)   // суммируем вторую партию
        sum2 += step2[i];
    cout << sum2 << endl;
    //  фальшивая монета легче, в наименьшей сумме она и окажется
    if (sum1 < sum2)
    {
        test2(part1, size);  // функция произведет проверку партии, если сумма меньше
    }
    if (sum1>sum2)
    {
        x += 8;              // это чило укажет на номер фальшивой монеты
        test2(part2, size);   // функция произведет проверку партиии, если сумма меньше
    }
    if (sum1 == sum2)   // Если сумма(вес) двух первых партий оказалсь равной, значит фальшивая монета в последней партии или 25 по счету.
    {
        x += 16;              // это чило укажет на номер фальшивой монеты
        test2(part3, size);    // функция произведет проверку последней партиии
    }
    return 0;
}
int test2(int step[], int size)
{
    for (int i = 0; i < 8; i++)  // это я вывел чтобы убедится, что в функцию передано то что я и хотел
        cout << step[i] << ' ';
    cout << endl;
    
    int count = 0;
    int w, z, gr = 3;
    for (int i = 0; i < 8; i++)
    {
        // разбиваем партию из 8 монет на 2 маленькие партии по 3 монеты
        if (count == gr)
            count = 0;
        if (i < gr)
            part4[count++] = step[i];  // первая маленькая партия  
        if (i>=gr && i < 2 * gr)
            part5[count++] = step[i];  // вторая маленькая партия
        if (i == 2 * gr)
            w = step[i];               // предпоследнюю монету помещаем в отдельную переменную
        if (i>2 * gr)
            z = step[i];               // последнюю монету помещаем в отдельную переменную 
    }
    for (int i = 0; i < gr; i++)      
    {
        sum4 += part4[i];        // Cкладываем содержимое маленькой партии
        sum5 += part5[i];        // Cкладываем содержимое другой маленькой партии
    }
    cout << sum4 << endl << sum5 << endl;
    if (sum4 < sum5)
    {
        test3(part4);           // сравниваем и по результату сравнения помещаем наименьшую в функцию.
    }
    if (sum4 > sum5)
    {
        x += 3;
        test3(part5);            // сравниваем и по результату сравнения помещаем наименьшую в функцию.
    }
    if (sum4 == sum5)
    {
        x += 6;                   // это чило укажет на номер фальшивой монеты
        test3_1(w, z);            // сравниваем и по результату сравнения помещаем две оставшиеся монеты в функцию.
    }
 
    cout << endl << endl;
 
    return 0;
}
int test3(int last[])
{
    if (last[0] < last[1])
        x += 1;                    // это чило укажет на номер фальшивой монеты
    if (last[0] > last[1])
        x += 2;                    // это чило укажет на номер фальшивой монеты
    if (last[0] == last[1])
        x += 3;                     // это чило укажет на номер фальшивой монеты
 
    return 0;
}
int test3_1(int w, int z)
{
    if (w < z)
        x += 1;                     // это чило укажет на номер фальшивой монеты
    if (w>z)
        x += 2;                     // это чило укажет на номер фальшивой монеты
    else
        x += 3;                    // это чило укажет на номер фальшивой монеты
    return 0;
}
Добавлено через 9 часов 43 минуты
Поставьте отметку.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2016, 19:45
Ответы с готовыми решениями:

Среди 13 монет есть одна отличающаяся по весу, за 3 взвешивания на чашечных весах найти ее
Известно, что среди 13 монет есть одна отличающаяся по весу (фальшивая - тяжелее она или легче –...

Надо за 4 взвешивания найти фальшивую монету
Если кому эта задачка покажется излишне простой, то просто скажите что знаете решение, не...

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

Определить за 3 взвешивания фальшивую монету
Есть 25 золотых монет. Одна из них фальшивая и она по весу меньше. Определить за 3 взвешивания...

4
 Аватар для SergioO
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
18.02.2016, 20:47 2
Цитата Сообщение от gogaloh Посмотреть сообщение
за 3 взвешивания на весах найти из 25 монет
может меня память подводит, но имхо нельзя
для n>2 число монет
https://www.cyberforum.ru/cgi-bin/latex.cgi?m\leq \frac{({3}^{n}-3)}{2}
, те для 3 взвешиваний 12 монет
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
18.02.2016, 20:52  [ТС] 3
SergioO, можно, я же привел решение.
0
 Аватар для SergioO
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
18.02.2016, 21:04 4
не зная вес монеты нельзя или вы переплюнули всех математиков занимавшихся этой проблемой

Добавлено через 3 минуты
Гудстейн указал метод определения фальшивой монеты и её типа за n взвешиваний, n≥3, если число монет

m ≤ ½(3^n – 2n + 3)
n=3, m=12!

оказалось, что для n>3 его решение не является лучшим: за n взвешиваний можно выделить фальшивую монету и определить её тип из большего числа монет:

m ≤ ½(3^n – 3).

Это обнаружили независимо друг от друга сразу несколько математиков, и в следующем 1946 году тот же журнал опубликовал довольно длинный перечень их имён и разных ступеней успеха, достигнутых на поприще розыска фальшивой монеты. В этом же номере журнала напечатано самое лучшее решение — решение Ф. Дж. Дайсона, будущего известного физика-теоретика.
теперь считаем n=3, m=12
gogaloh, вы себе льстите
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
18.02.2016, 21:12  [ТС] 5
SergioO, я льщу себе постоянно, не могу иначе. Фальшивая монета легче, прошу прощения, что забыл это указать. Это было указано в теме, с которой я и взял эту задачу.
На 76 строке это было указано.
0
18.02.2016, 21:12
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2016, 21:12
Помогаю со студенческими работами здесь

Найти минимальное число взвешиваний монет на чашечных весах, чтобы определить фальшивку
Есть 15 монет,одна из них фальшивая.Та,что фальшивая весит меньше.Нужно найти минимальное число...

Определить фальшивую монету за заданое число взвешиваний среди указанного количества золотых монет
Есть 25 золотых монет. Одна из них фальшивая и она по весу меньше. Определить за 3 взвешивания...

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

Найти фальшивую монету
Имеется 11 монет. Золотые все. Николаевские червонцы. Среди них одна фальшивая, позолоченная. А...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru