Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/146: Рейтинг темы: голосов - 146, средняя оценка - 4.60
-14 / 7 / 4
Регистрация: 24.02.2013
Сообщений: 234

Найти количество точек с целочисленными координатами, которые попадают внутрь заданной окружности, либо лежат на границе

29.11.2014, 20:02. Показов 27857. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задана окружность радиуса R с центром в точке (X,Y). Необходимо определить количество точек с целочисленными координатами, которые попадают внутрь этой окружности, либо лежат на границе.

Входные данные: три целых числа через пробел - X,Y,R. X,Y не превышает 10^9 по своему абсолютному значению. 1 <= R <= 1000.

Выходные данные: единственное число - количество точек внутри окружности.

Пример входных данных
0 0 2

Пример выходных данных
13

никак не могу осилить.

Добавлено через 15 минут
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
#include "stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    string temp;
    string Input;
    int Result;
 
    getline(cin, Input);
 
    for (int i = Input.length() - 1; Input[i] != ' '; i--)//считываем радиус в обратном порядке их строки ввода
    {
        temp += Input[i];
    }
    Input.clear();
    for (int i = temp.length()-1; i >=0; i--)//преобразовываем радиус в нормальный порядок
    {
        Input += temp[i];
    }
    Result = atoi(Input.c_str());//радиус в инте
 
    Result = (Result * 2) - 1;//кол-во точек на линии если ее провести горизонтально через центр окр Radius*2+1,а если отнять от этого выражения -2(не считаем точки через которые проведена окр) то получится кол-во точек внутри окр на этой горизонтали.
    cout << (Result*Result + 4);//получается что горизонталь == стороне вписанного в окр квадрата,значит если ее возвести в квадрат то получится количество всех точек внутри этой окр,и прибавляем 4 точки через которые проведена окр.
    /*getchar();
    getchar();*/
    return 0;
}
Тестил на куче примеров все норм пробую через онлайн ошибка в тестах.Получается что для этой задачи х и у избыточные данные?или я где-то ошибся?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.11.2014, 20:02
Ответы с готовыми решениями:

Определить, сколько точек с целочисленными координатами попадают в круг заданного радиуса с центром в начале координат
Вводится радиус круга R. Определить, сколько точек с целочисленными координатами попадают в круг заданного радиуса с центром в начале...

Найти количество точек с целочисленными координатами внутри заданного отрезка
как мне найти количество точек с целочисленными координатами внутри отрезка. Вам даны начальные точки отрезка(координаты)-x и y; и...

Найти количество точек с целочисленными координатами, попадающих в круг заданного радиуса с центром в начале координат
Вычислить количество точек с целочисленными координатами, попадающих в круг радиуса R (R&gt;0) с центром в начале координат. Как...

34
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
03.12.2014, 23:36
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SlavaSSU Посмотреть сообщение
ValeryS, если не хочется вычислять корень, то можно наоборот найти такой наибольший Y, что Y * Y <= r * r - x * x;
т.е предлагаешь перебор?
вряд ли он будет быстрее
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
03.12.2014, 23:41
ValeryS, я предлагаю бинарный поиск.

и можно еще ускорить. сделать бинпоиск(найти макс игрек) только при x == r, а дальше заметить что при уменьшении икса игрек будет только увеличиваться. т.е. надо один раз посчитать игрек , а потом каждый раз увеличивать его пока надо, вместо того чтобы каждый раз делать бинпоиск.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
03.12.2014, 23:48
Цитата Сообщение от SlavaSSU Посмотреть сообщение
сделать бинпоиск(найти макс игрек)
максимальный игрек равен радиусу, при x == r игрек равен 0
Цитата Сообщение от SlavaSSU Посмотреть сообщение
увеличиваться. т.е. надо один раз посчитать игрек , а потом каждый раз увеличивать его пока надо,
покажи на примере
можешь доработать мой код,а то я пока не врубаюсь
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
03.12.2014, 23:59
ValeryS,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int func2(int r)
{
int count=0;
int y = 0;
int rr = r * r;
for(int x=r;x>= 0;x--) // десь можно уменьшить в два раза подсчитывая полукгруг
 {
  while((y + 1) * (y + 1) <= rr - x * x)
      y++;
  count+=2*y+1;
 }
 
return count;
}
вот для полукруга насчитали ну далше умножим на 2 и вычтем 2 * r + 1;

ну или даже сразу


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int func2(int r)
{
int count=0;
int y = 0;
int rr = r * r;
for(int x=r;x>= 0;x--) // десь можно уменьшить в два раза подсчитывая полукгруг
 {
  while((y + 1) * (y + 1) <= rr - x * x)
      y++;
  count+=2*y+1;
 }
 
return 2 * count - (2 * r + 1);
}
Добавлено через 7 минут
ну и(если уж совсем хочется) можно предпосчитать глобальный массивчик квадратов натуральных чисел. и пользоваться им а не каждый раз возводить в квадрат игрек + 1.
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
04.12.2014, 00:08
щас проверим
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
04.12.2014, 00:16
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <math.h>
 
int func1(int r)
{
 int count=0;
 for(int i=-r;i<=r;i++)
  for(int j=-r;j<=r;j++)
      if((i*i+j*j)<=(r*r))
          count++;
 return count;
 
 
}
int func2(int r)
{
int count=0;
for(int x=r;x>=-r;x--) // десь можно уменьшить в два раза подсчитывая полукгруг
 {
  int y=(int)sqrt((double)(r*r)-(double)(x*x)); //подсчитываем y по теореме Пифагора
   // корень долгая операция как убыстрить не знаю
  count+=2*y+1;
 }
 
return count;
}
 
int sqrs[40001];
 
int func3(int r)
{
int count=0;
int y = 0;
int rr = r * r;
for(int x=r;x>= 0;x--) // десь можно уменьшить в два раза подсчитывая полукгруг
 {
  while(sqrs[y + 1] <= rr - sqrs[x])
      y++;
  count+=2*y+1;
 }
 
return 2 * count - (2 * r + 1);
}
 
 
int main(void) {
    for(int i = 0; i < 40000; i++)
        sqrs[i] = i * i;
 
for(int n=0;n<100;n++)
{
int S=(int)(n*n*3.14);
printf("%d\t",n);
printf("  %d \t",func1(n));
printf("  %d \t",func2(n));
printf("  %d \t",func3(n));
printf(" %d \n",S+1);
 
}
    return 0;
}
но там и без всего этого быстро работает.
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
04.12.2014, 00:29
переписал немного для длинных чисел
иначе результат уже врал
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <math.h>
#include<time.h>
 
unsigned long long int func1(int r)
{
 unsigned long long int count=0;
 for(int i=-r;i<=r;i++)
  for(int j=-r;j<=r;j++)
      if((i*i+j*j)<=(r*r))
          count++;
 return count;
 
 
}
unsigned long long  int func2( long long int r)
{
unsigned long long  int count=0;
for( long long int x=r;x>=-r;x--)
 {
  unsigned long long int y=(int)sqrt((double)(r*r)-(double)(x*x));
  count+=2*y+1;
 }
 
return count;
}
unsigned long long func3(long long int r)
{
unsigned long long int count=0;
long long int y = 0;
long long int rr = r * r;
for(long long int x=r;x>= 0;x--)
 {
  while((y + 1) * (y + 1) <= rr - x * x)
      y++;
  count+=2*y+1;
 }
 
return 2 * count - (2 * r + 1);
}
 
 
int main(void) {
clock_t start1 = clock();
for( long long int n=1000000;n<1001000;n++)
{
printf("%d\t",n);
printf("  %lld \n",func2(n));
 
}
clock_t end1 = clock();
 
clock_t start = clock();
for( long long int n=1000000;n<1001000;n++)
{
printf("%d\t",n);
printf("  %lld \n",func3(n));
}
clock_t end = clock();
printf("func2 time=%f\n",(double)(end1-start1)/CLOCKS_PER_SEC);
printf("func3 time=%f\n",(double)(end-start)/CLOCKS_PER_SEC);
return 0;
}
функцию SlavaSSU, обозвал func3

func2 time=147.298000
func3 time=43.397000

что ж неплохо
тысяча кругов с радиусом миллион за 43 секунды
дальнейшее убыстрение разве что со сменой алгоритма,
а нужно ли оно?
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
04.12.2014, 00:37
ValeryS, у меня считает за 109 и 17 секунд соответственно(я еще предпосчитал квадраты чисел). щас без них запущу и скажу.

109 и 33 соответсвенно без предподсчета квадратов.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
04.12.2014, 00:45
Господа, простите, что вклиниваюсь в ваш диалог, а что если я предложу функцию вычисления квадратного корня в натуральных числах, имхо быстрее чем через трунки флоатов?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
04.12.2014, 00:50
SlavaSSU, ну если тебе интересно мне уже нет
главное я реализовал свою идею
Цитата Сообщение от ValeryS Посмотреть сообщение
сдается мне здесь просто площадь нужно подсчитать
и при больших радиусах, число подозрительно напоминает число Пи
1 5
10 317
100 31417
1000 3141549
10000 314159053
100000 31415925457
1000000 3141592649625
10000000 314159265350589
1 5
10 317
100 31417
1000 3141549
10000 314159053
100000 31415925457
1000000 3141592649625
10000000 314159265350589
func2 time=1.565000
func3 time=0.499000
Добавлено через 1 минуту
Цитата Сообщение от _Ivana Посмотреть сообщение
а что если я предложу функцию вычисления квадратного корня в натуральных числах, имхо быстрее чем через трунки флоатов?
нук предложи
у SlavaSSU, вообще корня нет
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
04.12.2014, 00:56
У него было предложение бинпоиска с предварительным заполнением массива квадратов. А я не готов сказать, что это будет дольше, чем например вот это
C
1
2
        unsigned int x0, x1 = a;
        do {x0 = x1; x1 = (x0 + a/x0)>>1;} while (x1 < x0);
, особенно при хорошем начальном приближении, а не начиная с а. Но начать надо с числа, большего корня. если начинать с гарантированно меньшего, неравенство в условии только перевернуть и все.

Добавлено через 1 минуту
Ну и явно это должно быть быстрее, чем через обфлоативание интов, операции в плавучке и последующее обынтивание флоатов.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
04.12.2014, 01:00
_Ivana, щас в фанке3 вообще нет бинпоиска. фанк3 суммарно работает за R. а твоя штука будет работать за R * (сложность твоей бинпоископодбной штуки), короче, точно дольше чем фанк3.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
04.12.2014, 01:04
SlavaSSU, я не следил за развитием идей в теме, просто проходил мимо и прочитал обрывочные фразы про корень бинпоиском или перебором с предыдущего старта или вообще через флоаты, решил влезть/предложить, ну если не актуально, то что ж
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
04.12.2014, 01:15
Цитата Сообщение от _Ivana Посмотреть сообщение
чем через обфлоативание интов,
это вообще мизер
одной командой загоняется в сопроцессор
да и обратное преобразование недорого стоит
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
12.10.2017, 07:22
Возрадю тему
недавно пришлось решать практическую задачу, дан экран в виде круга, светодиоды с шагом 5 мм, посчитать количество светодиодов
Наши наработки прекрасно подошли
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2017, 07:22

Дано несколько точек с целочисленными координатами. Определить максимальное количество точек из них, лежащих на одной прямой. Если можно напечатать н
Я подумала, что нужно будет написать класс Point. Немного написала, и остановилась на методе, который проверяет принадлежность точки...

Вычислить количество точек с целочисленными координатами, принадлежащих кругу
Вычислить k - количество точек с целочисленными координатами, принадлежащих кругу радиуса R (R&gt; 0) с центром в начале координат. Точки,...

Вычислить количество точек с целочисленными координатами, находящихся в круге
вычислите количество точек с целочисленными координатами,находящиеся в круге радиуса R (R&gt;0)

Вывести количество точек, которые находятся внутри окружности либо на ее границе
Вводится x0,y0,r,n Координаты n точак x0,y0-центр окружности r-радиус n-количество точак Координаты n точак ВЫвести...

Подсчитать количество точек с целочисленными координатами, которые принадлежат заданной области на плоскости
Подсчитать количество точек с целочисленными координатами, которые принадлежат заданной области на плоскости.


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru