Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Закрытая тема
 
Опции темы Опции просмотра
Старый 26.06.2013, 10:36   #1 (permalink)
Rival
Member
 
Регистрация: 16.02.2013
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Перевод c C++ на Pascal

Есть задача
Группа программистов собралась в понедельник и на все свои деньги купила «Sprite» в бутылках емкостью по 0.25 л., не забыв взять сдачу.
Во вторник они сдали пустую посуду, добавили оставшуюся сдачу и вновь купили столько таких же бутылок «Sprite», сколько могли.
Так они действовали до пятницы. В пятницу, сдав посуду и добавив сдачу с четверга, они смогли купить только одну бутылку напитка. При этом денег у них уже не осталось.
Определить минимальную сумму, которой располагали программисты в понедельник.
Интерфейс программы:
входные данные:
n – стоимость бутылки напитка – целое число в разумных пределах,
k – стоимость пустой бутылки из-под «Sprite» (k<n),
выходные данные:
минимальная сумму, которой располагали программисты в понедельник .
Пример
Вход Выход
n=7 83
k=3
Есть решение, но я Си не знаю. Помогите пожалуйста перевести.

Код:
#include <iostream> 
#include <fstream>   
int main() 
{     
 int board[10][10] = {0};       
 std::ifstream input("input.txt");       
 int n;     
 int x, y;       
 input >> n;       
 for (int i = 0; i < n; ++i)     
 {         
  input >> x >> y;           board[x][y] = 1;     
 }       
 input.close();       
 int p = 0;       
 for (int i = 1; i < 9; ++i)     
  {
   for (int j = 1; j < 9; ++j)         
   {             
     if (board[i][j] == 1)             
    {                 
      if (board[i - 1][j] == 0)                     ++p;
      if (board[i][j + 1] == 0)                     ++p;
      if (board[i + 1][j] == 0)                     ++p;
      if (board[i][j - 1] == 0)                     ++p;             
    }         
   }     
  }       
 std::ofstream output("output.txt");       
 output << p;       
 output.close();       
 return 0;
Rival вне форума  

Старый 26.06.2013, 10:36
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Может быть на нашем форуме проблема уже решена, попробуйте посмотреть в похожих темах

Warcraft: Orcs & Humans
Перевод из шестнадцатеричной в восьмеричную

Старый 26.06.2013, 10:38   #2 (permalink)
Rival
Member
 
Регистрация: 16.02.2013
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Извините, не вышло почему, то нормально вставить
Код:
#include <iostream>
#include <fstream>
 
int main()
{
    int board[10][10] = {0};
 
    std::ifstream input("input.txt");
 
    int n;
    int x, y;
 
    input >> n;
 
    for (int i = 0; i < n; ++i)
    {
        input >> x >> y;
 
        board[x][y] = 1;
    }
 
    input.close();
 
    int p = 0;
 
    for (int i = 1; i < 9; ++i)
    {
        for (int j = 1; j < 9; ++j)
        {
            if (board[i][j] == 1)
            {
                if (board[i - 1][j] == 0)
                    ++p;
 
                if (board[i][j + 1] == 0)
                    ++p;
 
                if (board[i + 1][j] == 0)
                    ++p;
 
                if (board[i][j - 1] == 0)
                    ++p;
            }
        }
    }
 
    std::ofstream output("output.txt");
 
    output << p;
 
    output.close();
 
    return 0;
Rival вне форума  
Старый 26.06.2013, 10:46   #3 (permalink)
Rival
Member
 
Регистрация: 16.02.2013
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Извиняюсь, снова. Скинул не то решение. Это из другой задачи.
Вот правильное.
Код:
#include <iostream>
 
typedef long long  T_int;
 
T_int  get_prev_sum(T_int  sum, T_int F, T_int P)
{
    return  ((sum - F) / P + 1) * (F - P) + sum;        
}
 
int main()
{
    std::locale::global(std::locale(""));
    const T_int F_MAX = 1000000000;
    const T_int F_MIN = 2;
    const T_int P_MIN = 1;
 
    T_int F = 0;
    do
    {
        std::cout << "Стоимость полной бутылки F ("
                  << F_MIN 
                  << " <= F <= "
                  << F_MAX
                  << "): ";
        
        std::cin >> F;
    
    }while(   F < F_MIN
           || F_MAX < F);
 
    std::cout << std::endl;
 
    T_int P = 0;
    do
    {
        std::cout << "Стоимость пустой бутылки P ("
                  << P_MIN 
                  << " <= P < "
                  << F
                  << ")          : ";
        
        std::cin >> P;
    
    }while(   P < P_MIN
           || F <= P);
 
    T_int min_start_sum = F;
    for(T_int  i = 0; i < 4; ++i)
    {
        min_start_sum = get_prev_sum(min_start_sum, F, P);
    }
 
    std::cout << "Минимальная начальная сумма                      : "
              << min_start_sum
              << std::endl;
Rival вне форума  
Старый 26.06.2013, 14:34   #4 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,304
Сказал(а) спасибо: 290
Поблагодарили 512 раз(а) в 169 сообщениях
Репутация: 93301
По умолчанию

Так, в предыдущем решении - наврал. Считал, что 7 - это стоимость чистого напитка, без тары. А так действительно получается 83. Исправил.

Рассуждал я так.
Обозначим количество приобретенных бутылок в понедельник, вторник и т.д. до пятницы как m1, m2, m3, m4, m5. Полученную сдачу - как s1, s2, s3, s4, s5. По условию задачи m5=1 и s5=0. Теперь посмотрим на ситуацию в четверг. Пятничное приобретение единственной бутылки было сделано за счет сдачи s4 и продажи тары m4*3, откуда имеем
7 = m4*3 + s4, откуда m4 = (7 - s4)/3.
Казалось бы, не зная s4, найти m4 невозможно, но:
1. это диофантово уравнение, т.е. ответ (m4) должен быть целым числом.
2. мы интересуемся минимальной стартовой суммой, а значит и на каждом этапе из всех возможных количеств бутылок мы должны взять минимальное.
Практически это означает, что, стартуя с s4=6, мы должны уменьшать это s4 до тех пор, пока не получим целого m4.
Далее то же самое проделываем для m3, s3, потом для m2, s2 и, наконец, для m1, s1. Ответом будет
m1*7 + s1.

Программа:
Код:
Const
 n=7;
 k=3;
Var
 s,s1,i:byte;
 m:word;
Begin
 m:=1;
 s1:=0;
 For i:=1 to 4 do
  begin
   s:=7;
   repeat
    Dec(s);
   until Frac((m*n+s1-s)/k)=0;
   m:=Round((m*n+s1-s)/k);
   s1:=s;
  end;
 Writeln(m*n+s);
 Readln
End.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума  
Старый 26.06.2013, 15:24   #5 (permalink)
Rival
Member
 
Регистрация: 16.02.2013
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Хорошо, спасибо большое.
Rival вне форума  
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Закрытая тема

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 01:21.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.