• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Перевод c C++ на Pascal

  • Автор темы Автор темы Rival
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.

Rival

Новые
Регистрация
16 Фев 2013
Сообщения
17
Реакции
0
Баллы
0
Перевод 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;
 
Извините, не вышло почему, то нормально вставить
Код:
#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;
 
Извиняюсь, снова. Скинул не то решение. Это из другой задачи.
Вот правильное.
Код:
#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;
 
Так, в предыдущем решении - наврал. Считал, что 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.
 
Хорошо, спасибо большое.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху