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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 692
#1

Поясните задачу - C++

22.10.2011, 19:04. Просмотров 789. Ответов 2
Метки нет (Все метки)

Прошу разъяснить в задачи непонятные мне аспекты. Задача

Прямоугольник, стороны которого выражены натуральными числами M и N (1≤M, N ≤10000), разделен на квадраты размером 1*1. Найти число квадратов, пересекаемых диагональю прямоугольника (пересекает только тогда, когда делит его на две произвольные части).

Решение

Будем считать, что N (ось х) больше чем M (ось у). В противном случае обменяем их значения. Для каждого правой стороны каждого столбца (х=1,2 ....N-1) проверяем через какую строку проходит диагональ. Если через следующую (случай1), то количество клеток увеличиваем на 2, если через ту же (случай 2), что и предыдущая, то на 1. И если диагональ проходит через узел (случай 3), то результат не изменяется.



Вот такой код
с комментариями неясностей

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
#include<iostream>
#include <math.h>
#include<stdlib.h>
using namespace std;
int main ()
{ setlocale(LC_ALL,"Rus");
int n,m,c,y,y1,k,l; 
cout<<"Введите ширину прямоугольника --> ";
cin>>n;
cout<<"Введите длинну прямоугольника --> ";
cin>>m;
if(n<m)
 {c=m;m=n;n=c;}
y1=-1; 
k=0;
for(int x=1;x<n;x++) 
 {
  l=m*x%n; //Для чего эта операция конкретно и что она делает? Если попадается 0 то счета квадратов нет. 
  y=m*x/n; //Для чего эта операция конкретно и что она делает?  Если попадается 1, то считается только один квадрат
  if(l!=0) 
   {
       if(y==y1) 
       k=k+1;
  else 
       {k+=2;
       y1=y;
       }
   }
 }
cout<<k;
cin.get();
cin.get();
 return 0;
}
0
Миниатюры
Поясните задачу  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2011, 19:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поясните задачу (C++):

Поясните задачу С++ - C++
Здравствуйте, формучане! Есть задача: вычислить значение функции y для значений параметра a с шагом по x, равным dx Исходные данные: ...

Поясните, пожалуйста. - C++
Что означает &quot;%d&quot; Arr и sizeof в си?

Поясните за рекурсию - C++
Учу язык на одном из сайтов, столкнулся с таким примером программы с рекурсией: рекурсия в C++C++ #include &lt;iostream&gt; using...

Поясните алгоритм! - C++
Задано натуральное число N. Вывести на экран все пары натуральных чисел A&gt;10, B&gt;A таких, что значение произведения A*B&lt;N не изменится, если...

Поясните код - C++
Скачал исходник змейки, сейчас пытаюсь разобраться в коде Вот сам код : #include &lt;iostream&gt; //стандартная библиотека #include...

Поясните по шаблонам - C++
Читаю Солтера, а именно шаблоны. Наткнулся на &quot;некоторые компиляторы требуют что бы определения шаблонных методов помещались в...

2
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
22.10.2011, 20:25 #2
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
/////////////////////////////////////////////////////////////////////////////////////////
//Прямоугольник, стороны которого выражены натуральными числами M и N (1 ≤ M, N ≤ 10000), 
//разделен на квадраты размером 1 x 1. Найти число квадратов, пересекаемых диагональю 
//прямоугольника (пересекает только тогда, когда делит его на две произвольные части).
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
int  euclid
    (
        int  A,
        int  B
    )
{
    return B ? euclid(B, A % B) : A;
}
/////////////////////////////////////////////////////////////////////////////////////////
int  number_of_squares_intersected_by_diagonal
    (
        int A, 
        int B
    )
{
    return A + B - euclid(A, B);
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите стороны прямоугольника:"
              << std::endl
              << '\t'
              << "A = ";
 
    int  A = 0;
    std::cin >> A;
    std::cout << '\t'
              << "B = ";
    int  B = 0;
    std::cin >> B;
 
    std::cout << "Диагональ данного прямоугольника, разделенного на квадраты 1 х 1"
              << std::endl
              << "пересекает "
              << number_of_squares_intersected_by_diagonal(A, B)
              << " квадратов."
              << std::endl;
}
1
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
22.10.2011, 20:44 #3
см комментарии:
Цитата Сообщение от parkito Посмотреть сообщение
for(int x=1;x<n;x++)
{
l=m*x%n; //l будет равна 0 для 3-го случая, для случаев 1 и 2 l не равно 0 (даже на картинке это видно. Если все-таки не очень понятно, то Вам нужно разобраться с подобными прямоугольниками)
y=m*x/n; //здесь y будет отличаться от предыдущего значения (которое записано в y1) только для случая 2. Это тоже хорошо видно из рисунка. И y принимает значения не только 0 или 1, а от 0 и до m-1.
if(l!=0)
{
if(y==y1)
k=k+1;
else
{k+=2;
y1=y;
}
}
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2011, 20:44
Привет! Вот еще темы с ответами:

Поясните считывание - C++
/*Считывание первой матрицы*/ //создание матрицы float**firstMatrix = new float*; //считывание матрицы const char separator...

Поясните задание - C++
Разработать программу учета &quot;указаний сверху&quot; (учет новых указаний и удаление выполненных). Данные представить в виде линейного...

Поясните по указателям - C++
Добрый день товарищи. У меня вопрос: #include &lt;iostream&gt; using namespace std; int main() {

Поясните элементарность - C++
Я c++ еще не начанал учить, по этому элементарный вопрос, просьба не троллить. Так вот, правда что с помощью c++ можно рисовать, напрмер...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru