-14 / 7 / 4
Регистрация: 24.02.2013
Сообщений: 234

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

29.11.2014, 20:02. Показов 27406. Ответов 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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
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,989
Записей в блоге: 32
04.12.2014, 00:45
Господа, простите, что вклиниваюсь в ваш диалог, а что если я предложу функцию вычисления квадратного корня в натуральных числах, имхо быстрее чем через трунки флоатов?
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
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,989
Записей в блоге: 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,989
Записей в блоге: 32
04.12.2014, 01:04
SlavaSSU, я не следил за развитием идей в теме, просто проходил мимо и прочитал обрывочные фразы про корень бинпоиском или перебором с предыдущего старта или вообще через флоаты, решил влезть/предложить, ну если не актуально, то что ж
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
04.12.2014, 01:15
Цитата Сообщение от _Ivana Посмотреть сообщение
чем через обфлоативание интов,
это вообще мизер
одной командой загоняется в сопроцессор
да и обратное преобразование недорого стоит
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru