Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Старинная задача 
:(
    Опции темы
Tep4k111
Дата 4.12.2013, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 25.11.2013

Репутация: нет
Всего: нет



Условие:

Плата за быка 10 рублей, за корову – 5 рублей, за телёнка – полтинник (0,5 рубля). Определить, можно ли ровно на M рублей купить ровно N голов скота. Если это возможно, вывести "yes", в противном случае – "no".
Ввод
В первой строке ввода содержатся целые числа M (1 ≤ M ≤ 100) и N (1 ≤ N ≤ 100).
Вывод
В первой строке – "yes" или "no".

Вот у меня есть код, работает почти со всеми числами (по непонятным причинам)

Код

#include <iostream.h>
#include <conio.h>
void main ()
{
int b,k,t,m,n,p=0;
cout << "How much money have you got? 1<=M<= 100"<<endl;
cin >> m;
cout << "Enter the number of animals: 1<=N<=100"<<endl;
cin>>n;
if ( (m / 10 == n)&&(m%10==0) || (m / 5 == n)&&(m%5==0) || (m * 2 == n) ) cout << " Yes ";
else { for (int i = 1; i < n; i++)
    {
      if ( (m/2!=n)&&(((m-10*i)/10==n) || ((m-10*i)/5==n) || ((m-10*i)*2==n)) ) { p++; break;}
      else
          {
           if ( (m/10!=i)&&(((m-5*i)/10==n) || ((m-5*i)/5==n) || ((m-5*i)*2==n) )) {p++; break;}
           else
               {
                if ( (i!=1)&&(i%2!=0)&&(((m-i/2)/10==n) || ((m-i/2)/5==n) || ((m-i/2)*2==n)) ) {p++; break;}
               }
          }
    }
    if (p!=0) cout<<"Yes";
        else cout<<"No";
     }
getch();
}



Заранее спасибо за любую помощь.


Это сообщение отредактировал(а) Tep4k111 - 4.12.2013, 01:28
PM MAIL   Вверх
smalcom
Дата 4.12.2013, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



проблема в чём?


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
Tep4k111
Дата 4.12.2013, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 25.11.2013

Репутация: нет
Всего: нет



Цитата(smalcom @ 4.12.2013,  05:48)
проблема в чём?

либо подскажите как дописать задачу, ибо не работает с числами, заканчивающимися на 9, к примеру 29 денег на 12 голов 
PM MAIL   Вверх
Guinness
Дата 4.12.2013, 09:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(Tep4k111 @  4.12.2013,  09:41 Найти цитируемый пост)
ибо не работает с числами, заканчивающимися на 9, к примеру 29 денег на 12 голов 

Странно, что вообще что-то работает. Где инициализация переменных b,k,t,p. Также рекомендую дать им нормальные имена, чтобы не запутаться.
Далее, я не очень улавливаю Ваш алгоритм. Попробуйте что-нибудь вынести в отдельные функции, выделить константы:
Код

const double BULL_PRICE = 10.;
const double COW_PRICE = 5.;
const double CALF_PRICE = 0.5;


Добавлено @ 09:36
И я бы все же пошёл по другому пути. В общем виде задача у меня не решилась, поэтому решать нужно перебором. Искомые уравнения:
Код

10x + 5y + 0,5z = M
x + y + z = N

Далее запускаются циклы сначала по х: 0:12, а внутри него по y: 0:12-x. Таким образом получим следующее уравнение:
Код

10x + 5y + 0,5(N-x-y) = M,
где x и y счётчики циклов

По идее должно работать.

Это сообщение отредактировал(а) Guinness - 4.12.2013, 09:37
PM MAIL   Вверх
bsa
Дата 4.12.2013, 11:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



так как тут идут вычисления с плавающей точкой, то применять условия вида if (x == y) нельзя. Вместо этого необходимо использовать if (fabs(x - y) < eps), где eps какое-то маленькое число (например, 0.00001).
Как вариант, можно все цены умножить на 10 и уже работать с целыми числами. В этом случае указанной проблемы не будет.
PM   Вверх
feodorv
Дата 4.12.2013, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(bsa @  4.12.2013,  12:10 Найти цитируемый пост)
Как вариант, можно все цены умножить на 10 и уже работать с целыми числами. В этом случае указанной проблемы не будет. 

 smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Tep4k111
Дата 4.12.2013, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 25.11.2013

Репутация: нет
Всего: нет



Цитата(Guinness @ 4.12.2013,  09:33)
Цитата(Tep4k111 @  4.12.2013,  09:41 Найти цитируемый пост)
ибо не работает с числами, заканчивающимися на 9, к примеру 29 денег на 12 голов 

Странно, что вообще что-то работает. Где инициализация переменных b,k,t,p. Также рекомендую дать им нормальные имена, чтобы не запутаться.
Далее, я не очень улавливаю Ваш алгоритм. Попробуйте что-нибудь вынести в отдельные функции, выделить константы:
Код

const double BULL_PRICE = 10.;
const double COW_PRICE = 5.;
const double CALF_PRICE = 0.5;


Добавлено @ 09:36
И я бы все же пошёл по другому пути. В общем виде задача у меня не решилась, поэтому решать нужно перебором. Искомые уравнения:
Код

10x + 5y + 0,5z = M
x + y + z = N

Далее запускаются циклы сначала по х: 0:12, а внутри него по y: 0:12-x. Таким образом получим следующее уравнение:
Код

10x + 5y + 0,5(N-x-y) = M,
где x и y счётчики циклов

По идее должно работать.

Вроде как написал ваш цикл, только не то получается.. 
Код

#include <iostream.h>
#include <conio.h>

const double BULL_PRICE = 10.;
const double COW_PRICE = 5.;
const double CALF_PRICE = 0.5;

void main ()
{
int x,y,PRICE,ANIMALS;
double M;
cout<<"Etner PRICE=";
cin>>PRICE;
cout<<"Enter the figer animals=";
cin>>ANIMALS;
int N;
for (x=0; x<=E; x++)
{
 for (y=0; x<=y; y++)
 {
  M=BULL_PRICE*x+COW_PRICE*y+CALF_PRICE*(N-x-y);
  }
  }
clrscr();
cout<<M;
getch();
}


что с ценой делать и вводимыми животными.. 
PM MAIL   Вверх
feodorv
Дата 4.12.2013, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Tep4k111 @  4.12.2013,  19:48 Найти цитируемый пост)
Вроде как написал ваш цикл

Только вроде как  smile 

Цитата(Guinness @  4.12.2013,  10:33 Найти цитируемый пост)
10x + 5y + 0,5(N-x-y) = M

Если умножить на два и переписать в виде
Цитата
20x+10y = 2M - N + x + y;
то сразу становится заметно, что правая часть должна делиться на 10... Ну и проверки на слишком большие и слишком малые значения N тоже можно сделать...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Tep4k111
Дата 4.12.2013, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 25.11.2013

Репутация: нет
Всего: нет



Цитата(feodorv @ 4.12.2013,  19:12)
Цитата(Tep4k111 @  4.12.2013,  19:48 Найти цитируемый пост)
Вроде как написал ваш цикл

Только вроде как  smile 

Цитата(Guinness @  4.12.2013,  10:33 Найти цитируемый пост)
10x + 5y + 0,5(N-x-y) = M

Если умножить на два и переписать в виде
Цитата
20x+10y = 2M - N + x + y;
то сразу становится заметно, что правая часть должна делиться на 10... Ну и проверки на слишком большие и слишком малые значения N тоже можно сделать...

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

Это сообщение отредактировал(а) Tep4k111 - 4.12.2013, 19:32
PM MAIL   Вверх
feodorv
Дата 4.12.2013, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Tep4k111 @  4.12.2013,  20:29 Найти цитируемый пост)
а можете хоть начало оформить
Код

#include <stdio.h>

void zadacha( int N, int M)
{
  int x, y;

  for( x = 0; x <= N; ++x)
    for( y = 0; y <= N-x; ++y)
      if( 19*x+9*y+N == 2*M )
      {
        printf( "N=%-3d  M=%-3d  x=%-3d  y=%-3d  z=%-3d\n", N, M, x, y, N-x-y);
        return;
      }
}

int main( void )
{
  int N, M;

  for( N = 1; N <= 100; ++N)
    for( M = 1; M <= 100; ++M)
      zadacha( N, M);

  return 0;
}

Цитата

...
N=12   M=29   x=1    y=3    z=8  
...



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.