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

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

Восстановить пароль Регистрация
 
parkito
 Аватар для parkito
11 / 11 / 2
Регистрация: 22.03.2010
Сообщений: 685
22.10.2011, 19:04     Поясните задачу #1
Прошу разъяснить в задачи непонятные мне аспекты. Задача

Прямоугольник, стороны которого выражены натуральными числами 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;
}
Миниатюры
Поясните задачу  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2011, 19:04     Поясните задачу
Посмотрите здесь:

Поясните алгоритм! C++
поясните действия C++
C++ Поясните новичку!
C++ Поясните задание
C++ Поясните код
C++ Поясните по указателям
C++ Поясните на пальцах)
C++ Поясните задачу С++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,671
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;
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 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;
}
}
}
Yandex
Объявления
22.10.2011, 20:44     Поясните задачу
Ответ Создать тему
Опции темы

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