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

Задачка для мозга - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
26.10.2011, 09:17     Задачка для мозга #1
Помогите решить задачку:

Рассеянный кассир, оплачивая чек мистеру X, перепутал доллары и центы и отсчитал клиенту доллары вместо центов и центы вместо долларов. Купив газету за пять центов, X обнаружил, что денег у него вдвое больше, чем он должен был получить по чеку. На какую сумму был выписан чек?

Нашел ее решение в устном виде, известно что используется диофантово ур-ие. Но как сделать решение задачи на Си в общем виде, чтоб программа сама нашла ответ, ни как догнать не могу... Полное решение не прошу) Хотя бы советы, или мысли по поводу задачи. Хочется все таки самому сделать в итоге.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 10:06     Задачка для мозга #2
[quote=DenProx;2105431]Хотя бы советы, или мысли по поводу задачи. [quote]
Пусть А - цена товара
Это вещественное число, т.к. в задаче речь ведётся и про доллары и про центы
Итак А = В + С/100 (где В - число долларов С - число центов)

Бедный мистер Х сделал следующую проплату
D + E (где D = С - число долларов Е = В - число центов)
Переведём D + E в доллары, получим A1 = D + E/100

Имеем разницу
А - А1 = В + С/100 - С + В/100
Пусть в кошельке изначально было Z долларов
Цитата Сообщение от DenProx Посмотреть сообщение
что денег у него вдвое больше, чем он должен был получить по чеку.
Имеем (Z - A)*2 = (Z - A1)

Вот система
А - А1 = В + С/100 - С + В/100
(Z - A)*2 = (Z - A1)

Решите её относительно В и С, как по мне всё довольно просто...
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
26.10.2011, 10:09  [ТС]     Задачка для мозга #3
-=ЮрА=-, спасибо) буду думать)
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 10:15     Задачка для мозга #4
Продолжу (Z - A)*2 = (Z - A1) => Z = A - A1
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А - А1 = В + С/100 - С + В/100
- как видим стоимость покупки зависит от изначального количества денег в кошельке мистера Х
Получаем
100*Z = 101*В - 99*С

Добавлено через 3 минуты
DenProx, сама программа не проблемма, меня смущает множественнность решений
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
стоимость покупки зависит от изначального количества денег в кошельке мистера Х
, вы говорили что обладаете

Цитата Сообщение от DenProx Посмотреть сообщение
Нашел ее решение в устном виде, известно что используется диофантово ур-ие.
- приведите это решение, написать программу для меня не проблемма, сам алгоритм нужен, вот
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
26.10.2011, 10:25  [ТС]     Задачка для мозга #5
-=ЮрА=-,

Рассеянный кассир, оплачивая чек мистеру Брауну, перепутал доллары и центы и отсчитал клиенту доллары вместо центов и центы вместо долларов. Купив газету за пять центов, Браун обнаружил, что денег у него ровно в двое больше, чем он должен получить по чеку. На какую сумму был выписан чек?
Решение: Пусть х – число долларов, а у – число центов в той сумме, на которую мистер Браун выписал чек. Запишем условие задач в виде уравнения: 100у+х–5=2(100х+у), или, 99у-199х=5. Это диофантово уравнение, имеющее бесконечно много решений в целых числах. Обычный метод решения с помощью непрерывных дробей дает наименьшее значение в положительных числах х=31, у=63. Следовательно, мистер Браун выписал чек на сумму 31 доллар 63 цента. Это единственный ответ к задачи, поскольку ближайшее к найденному решение х=129, у=262 не удовлетворяет требованию: у должен быть меньше 100 (В одном долларе сто центов). Ответ: 31 доллар 63 цента.

http://www.tgl.net.ru/wiki/index.php...%D0%B8%D0%B5_7
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 10:34     Задачка для мозга #6
Цитата Сообщение от DenProx Посмотреть сообщение
Это диофантово уравнение, имеющее бесконечно много решений в целых числах.
- а ну получается я был прав, ну что тогда я попробую организовать этот перебор
Цитата Сообщение от DenProx Посмотреть сообщение
с помощью непрерывных дробей
и вконце будет пропечатано

Цитата Сообщение от DenProx Посмотреть сообщение
наименьшее значение в положительных числах х=31, у=63
+ учту эти ограничения
Цитата Сообщение от DenProx Посмотреть сообщение
у должен быть меньше 100
. т.е программа нужна чтобы сделать перебор за насМне понадобиться какое-то время, хотя Вы тожете можете попробовать указанный мною пробор поорганизовывать, когда буду готов отпишусь и сравним что у нас получилось, как Вам идея?
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
26.10.2011, 10:38  [ТС]     Задачка для мозга #7
-=ЮрА=-, идея хорошая) но я только вечером возможно буду готов... щас на работе, времени нет
-=ЮрА=-
26.10.2011, 10:40
  #8

Не по теме:

Цитата Сообщение от DenProx Посмотреть сообщение
щас на работе, времени нет
-аналогично сижу на форуме параллельно с планами на ноябрьТогда до вечера

DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
27.10.2011, 09:01  [ТС]     Задачка для мозга #9
-=ЮрА=-,

Не по теме:

ок



Добавлено через 22 часа 19 минут
Что то у меня пока не особо получается. Еще и работы привалило... в нете нашел решение подобной задачи, но ответ выдает не совсем такой как указан в приведенном мной примере выше.

вот код, который я нашел:
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
/* Author:  Pate Williams (c) 1997 */
 
#include <stdio.h>
 
#define DEBUG
 
 
void extended_euclid(long a, long b, long *x, long *y, long *d)
 
/* calculates a * *x + b * *y = gcd(a, b) = *d */
 
{
 
  long q, r, x1, x2, y1, y2;
 
 
  if (b == 0) {
 
    *d = a, *x = 1, *y = 0;
 
    return;
 
  }
 
  x2 = 1, x1 = 0, y2 = 0, y1 = 1;
 
  #ifdef DEBUG
  printf("------------------------------");
  printf("-------------------\n");
  printf("q    r    x    y    a    b    ");
  printf("x2   x1   y2   y1\n");
  printf("------------------------------");
  printf("-------------------\n");
  #endif
 
  while (b > 0) {
 
    q = a / b, r = a - q * b;
 
    *x = x2 - q * x1, *y = y2 - q * y1;
 
    a = b, b = r;
 
    x2 = x1, x1 = *x, y2 = y1, y1 = *y;
 
    #ifdef DEBUG
    printf("%4ld %4ld %4ld %4ld ", q, r, *x, *y);
    printf("%4ld %4ld %4ld %4ld ", a, b, x2, x1);
    printf("%4ld %4ld\n", y2, y1);
    #endif
 
  }
 
  *d = a, *x = x2, *y = y2;
 
  #ifdef DEBUG
  printf("------------------------------");
  printf("-------------------\n");
  #endif
 
}
 
 
 
int main(void)
{
 
  long a = 199, b = 98, d, x, y;
 
  extended_euclid(a, b, &x, &y, &d);
 
  printf("x = %ld y = %ld d = %ld\n", x, y, d);
 
  //return 0;
  getch();
}
-=ЮрА=-
Заблокирован
Автор FAQ
27.10.2011, 09:30     Задачка для мозга #10
DenProx, честно вчера завеялся и просто руки не дошли
DenProx
27.10.2011, 11:04  [ТС]
  #11

Не по теме:

-=ЮрА=-, да не страшно) у самого еще дел образовалось кучу... тож пока не до задачки )

DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
22.11.2011, 11:03  [ТС]     Задачка для мозга #12
Хотел бы поднять тему, т.к. решить так и не получилось пока что задачу, так чтобы ответы совпали с теми что приводятся в примере.
-=ЮрА=-
Заблокирован
Автор FAQ
22.11.2011, 13:11     Задачка для мозга #13
Цитата Сообщение от DenProx Посмотреть сообщение
Хотел бы поднять тему, т.к. решить так и не получилось пока что задачу, так чтобы ответы совпали с теми что приводятся в примере.
- приношу извинения я тогда сделал, а разместить забыл, ниже мой взгляд на проблемму
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
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    long B, C, Z;
    cout<<"Z - vsego deneg v koshelke\n";
    cout<<"Z - B + C/100.0 deistvit stoimost pokypki\n";
    cout<<"Z - C + B/100.0 den'gi kotorie yplatil mister\n";
    cout<<"  Z   B   C\tZ - B + C/100.0\tZ - C + B/100.0\n";
    for(Z = 1; Z < 100 ; Z++)
    for(B = 1; B < 100 ; B++)
    for(C = 1; C < 100 ; C++)
    {
        if((Z - B + C/100.0) == (Z - C + B/100.0)*2)
        if(100*Z == 199*C - 98*B)
        {
            cout<<setw(3)<<Z<<" "
                <<setw(3)<<B<<" "
                <<setw(3)<<C<<"\t"
                <<setw(8)<<Z - B + C/100.0<<"\t"
                <<setw(8)<<Z - C + B/100.0<<endl;
        }
    }
    system("pause");
    return 0;
}
Вывод в консоль на миниатюре
Миниатюры
Задачка для мозга  
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
22.11.2011, 13:16  [ТС]     Задачка для мозга #14
-=ЮрА=-, Спасибо) Можете немного объяснить, что выводится?) ответ к которому я стремился :
Х = 31, У = 63. По какому условию можно выбрать эти значения из данных чисел?
-=ЮрА=-
Заблокирован
Автор FAQ
22.11.2011, 13:27     Задачка для мозга #15
Цитата Сообщение от DenProx Посмотреть сообщение
-=ЮрА=-, Спасибо) Можете немного объяснить, что выводится?) ответ к которому я стремился : Х = 31, У = 63. По какому условию можно выбрать эти значения из данных чисел?
возвращаюсь ко 2-му посту
Итоговая система:
А - А1 = В + С/100 - С - В/100

Не по теме:

(я в формуле накосил когда скобки раскрыл было В + С/100 - С + В/100)


(Z - A)*2 = (Z - A1)
Раскрыв скобки получим
Z = 2*A - A1 {A = B + C/100; A1 = C + B/100}
Z = 2*B + (2/100)*C - C - B/100
100*Z = 199*B - 98*C

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
(Z - A)*2 = (Z - A1)
if((Z - B + C/100.0) == (Z - C + B/100.0)*2)
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
22.11.2011, 13:32  [ТС]     Задачка для мозга #16
-=ЮрА=-, Спасибо)) Уже понял))

кст, вот еще один вариант решения:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
main()
{
     int x,y,i;
     for(x=1;x<100;x++)
     {
          for(y=1;y<100;y++)
          {
               if(x==((199*y-5)/98))
               {
                    cout << "x: " << x << " " << "y: " << y << endl;
                    i++;
               }
          }
     }
     cout << i;
     system("pause");
}
-=ЮрА=-
Заблокирован
Автор FAQ
22.11.2011, 13:38     Задачка для мозга #17
DenProx, предостерегаю Вас, здесь кроется недочёт
Цитата Сообщение от DenProx Посмотреть сообщение
if(x==((199*y-5)/98))
Типы переменных int делите на int Вы можете 2/3 и получить нолик, я недаром писал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
B/100.0
- эти неявно к даблу преобразовывал, вот. Будьте внимательны при делении, я сам много раз обжигался
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
22.11.2011, 13:44  [ТС]     Задачка для мозга #18
-=ЮрА=-, спасибо!)) Учту на будущее
-=ЮрА=-
22.11.2011, 13:45
  #19

Не по теме:

PS:Мне не очень понятно откуда появилось 5

Цитата Сообщение от DenProx Посмотреть сообщение
if(x==((199*y-5)/98))

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2011, 13:46     Задачка для мозга
Еще ссылки по теме:

стоит связываться или это не задачка для начинающих? C++
Задачка для реализации в С++ C++
C++ Работа с реестром, взрыв мозга

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

Или воспользуйтесь поиском по форуму:
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,009
22.11.2011, 13:46  [ТС]     Задачка для мозга #20
-=ЮрА=-, исходное уравнение задачи: 98х-199у=5 (5 центов)
Yandex
Объявления
22.11.2011, 13:46     Задачка для мозга
Ответ Создать тему
Опции темы

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