float R = ...;
int count = 0;
count += (int)R * 2;
for ( int i = 1; i < R; ++i )
count += (int)sqrt(R*R - i*i) * 2 + 1;
(c)Количестов точек в окружности
Тут скорее вопрос не в коде, а в формуле.Для нахождения количества точек с целым радиусом формулу я знаю.Но вот что делать если радиус будет например 3.57?
Код:
specter
Если можеш объясни поподробнее нащет этого перевода.
Цитата: JKJ
Как оказалось формула пов ычислению точек которую я считал правильной оказалась мыльным пузырем)ТАк что буду очень презнателен если мнее ее напишут.
specter
Если можеш объясни поподробнее нащет этого перевода.
specter
Если можеш объясни поподробнее нащет этого перевода.
Это уже готовый алгоритм, ток нужна небольшая поправка (правда я его не тестировал)
Код:
float R = ...;
int count = 0;
count += (int)R * 2 +1;
for ( int i = 1; i < R; ++i )
count += ((int)sqrt(R*R - i*i) * 2 + 1)*2;
int count = 0;
count += (int)R * 2 +1;
for ( int i = 1; i < R; ++i )
count += ((int)sqrt(R*R - i*i) * 2 + 1)*2;
По поводу алгоритма - при преобразовании вещественного числа к инту отсекаятся дробная часть...
Теперь возьмем точку, где x=0, y будет равен R (нам нужно взять только целую часть)... т.е. точек с целыми координатами будет (int)R * 2 +1
Для твоего примера, когда R = 3.57 мы получим при приведении к инту 3... итого 7 точек по формуле: (0,-3), (0,-2), (0,-1), (0,0), (0,1), (0,2), (0,3)
Далее берем все целые точки от 1 до R... находим значение y (sqrt(R*R - i*i)), отсекам дробную часть и получаем колв-во точек где y больше 0, при умножении на 2 учитываем точки, где y меньше 0... потом +1 - точка где y=0... И еще * на 2 для точек где x < 0... вобщем-то все
Самый быстрый способ - пожалуй, перебор змейкой от центра круга.
Код:
float R = ...;
int count = 0;
count += (int)R * 2 +3;
for ( int i = 1; i < R; ++i )
count += ((int)sqrt(R*R - i*i) * 2 + 1)*2
int count = 0;
count += (int)R * 2 +3;
for ( int i = 1; i < R; ++i )
count += ((int)sqrt(R*R - i*i) * 2 + 1)*2
Так выщитывает,однако только целые числа.
Зачто отвечает команда sqrt?
Цитата: JKJ
Код:
float R = ...;
int count = 0;
count += (int)R * 2 +3;
for ( int i = 1; i < R; ++i )
count += ((int)sqrt(R*R - i*i) * 2 + 1)*2
int count = 0;
count += (int)R * 2 +3;
for ( int i = 1; i < R; ++i )
count += ((int)sqrt(R*R - i*i) * 2 + 1)*2
Так выщитывает,однако только целые числа.
Зачто отвечает команда sqrt?
Считает и для вещественных. sqrt - это квадратный корень
Код:
$R = 20;
$s = int($R);
for($j = 1; $j <= $R; $j++)
{
for($i = 1; $i <= $R; $i++)
{
$s++
if $i*$i + $j*$j <= $R*$R;
}
}
$s = 4*$s + 1;
print "Точек: $s\n";
$s = int($R);
for($j = 1; $j <= $R; $j++)
{
for($i = 1; $i <= $R; $i++)
{
$s++
if $i*$i + $j*$j <= $R*$R;
}
}
$s = 4*$s + 1;
print "Точек: $s\n";
Цитата: Nixus
Код:
$R = 20;
$s = int($R);
for($j = 1; $j <= $R; $j++)
{
for($i = 1; $i <= $R; $i++)
{
$s++
if $i*$i + $j*$j <= $R*$R;
}
}
$s = 4*$s + 1;
print "Точек: $s\n";
$s = int($R);
for($j = 1; $j <= $R; $j++)
{
for($i = 1; $i <= $R; $i++)
{
$s++
if $i*$i + $j*$j <= $R*$R;
}
}
$s = 4*$s + 1;
print "Точек: $s\n";
На чем это ты написал?
И что за странное условие if $i*$i + $j*$j <= $R*$R;
Код:
#include <stdio.h>
const float R = 20.3;
int main()
{
int s, i, j;
s = R;
for(j = 1; j <= R; j++)
{
for(i = 1; i <= R; i++)
{
if(i*i + j*j <= R*R)
s++;
}
}
s = 4*s + 1;
printf("Точек: %i\n", s);
return 0;
}
const float R = 20.3;
int main()
{
int s, i, j;
s = R;
for(j = 1; j <= R; j++)
{
for(i = 1; i <= R; i++)
{
if(i*i + j*j <= R*R)
s++;
}
}
s = 4*s + 1;
printf("Точек: %i\n", s);
return 0;
}
В случае count += (int)R * 2 +1; выщитывает с дробным r.
Проверял на с помощью циркуля^^
ТАк что еще 1 вопрос, как отлечить дробное от целого?(что бы вставить if).