5.02.2012 / 20:29 | |
LPzhelud Пользователь Сейчас: Offline
Имя: Коля Откуда: Москва Регистрация: 02.06.2010
| Melodic, aNNiMON просто неправильно написал надо так: speed.plus(acc);
if(speed.getValue>MAX_SPEED) speed.setValue(MAX_SPEED);
Иначе, действительно, при достижении максимальной скорости вектор не будет больше изменяться __________________
Эль Презеденте Изменено LPzhelud (5.02 / 20:31) (всего 2 раза) |
5.02.2012 / 20:29 | |
Melodic Пользователь Сейчас: Offline
Регистрация: 16.09.2011
| aNNiMON, наоборот. Ускорение зависит от угла поворота. Если достигнута максимальная скорость, то не будет прибавляться ускорение. Если не прибавили ускорение к скорости, то угол никак не повлияет на скорость. -> при максимальной скорости направление скорости не изменить.
|
5.02.2012 / 20:33 | |
Melodic Пользователь Сейчас: Offline
Регистрация: 16.09.2011
| LPzhelud, скорость у меня задана в векторном виде. Пробывал так. acc.x = 0;
acc.y = thrust;
acc.angle = 0;
acc.rotate(angle);
speed.plus(acc);
int sp = speed.length();
if (sp> maxSpeed * maxSpeed) {
speed.x = 0;
speed.y = maxSpeed;
speed.angle = 0;
speed.rotate(angle);
}
Если скорость не успела достигнуть максимального значения и повернуть корабль, то всё работает, но как только достигла максимума перестаёт работать. Изменено Melodic (5.02 / 20:36) (всего 2 раза) |
5.02.2012 / 20:36 | |
LPzhelud Пользователь Сейчас: Offline
Имя: Коля Откуда: Москва Регистрация: 02.06.2010
| Melodic, просто вектору просто так не задашь скорость, это довольно-таки компликативно)
__________________
Эль Презеденте |
5.02.2012 / 20:37 | |
Melodic Пользователь Сейчас: Offline
Регистрация: 16.09.2011
| LPzhelud, почему? у скорости же есть направление, а её величина это модуль вектора)
|
5.02.2012 / 20:46 | |
Melodic Пользователь Сейчас: Offline
Регистрация: 16.09.2011
| Решил вопрос) возможно криво) if(speed.getValue>MAX_SPEED) speed.setValue(MAX_SPEED-thrust); // но всё же криво)) заметно только при резком повороте
Изменено Melodic (5.02 / 20:50) (всего 1 раз) |
6.02.2012 / 01:41 | |
ptiCa Пользователь
| Melodic, Сделай функцию от скорости типа 0.1 коэффициент сопротивления з задержкой в 0.5 секунды хотя мб это быдлокод |
6.02.2012 / 01:43 | |
ptiCa Пользователь
| Сможешь выложить полное условие ? Мне интересно про кораблик |
27.07.2012 / 17:00 | |
Ксакеп Модератор форума Сейчас: Offline
Регистрация: 20.06.2012
| Рассмотрим десятичную запись числа Pi. Возьмем первые 1415 знаков после десятичной точки и рассмотрим все возможные пары цифр, идущих подряд. Например, 14, 41, 15, 59, 92 ... Какая из этих пар встречается чаще всего? Если таких пар несколько, найдите пару с максимальным значением (рассматривая ее как целое число в [0; 99]). Сколько раз встречается эта пара? Опишите, каким образом был получен ответ. Открыть спойлер Закрыть спойлер Решение:
Изначально я предполагал, что программа должна самостоятельно генерировать запись числа пи, но немного погуглив, понял, что для того чтобы рассчитать тысячную цифру потребуется около 5 минут. Поэтому идем на сайт http://www.terver.ru/pi1000.php и забираем цифры. Я для удобства поместил их в файл.
Другой вопрос, каким образом посчитать повторения пар чисел и как найти ту пару, которая повторяется максимальное количество раз. Решение простое: создаем массив 10х10, где столбцы - десятки, а строки - единицы. Инкрементируем элементы массивы в зависимости от пары, находим максимальный элемент и выводим результат.
Исходный код (C#):string pi = "";
// Читаем число пи
System.IO.StreamReader sr = new System.IO.FileInfo("pi.txt").OpenText();
while (sr.Peek() != -1)
pi += sr.ReadLine();
sr.Close();
// Считаем пары
int[,] array = new int[10, 10];
for (int i = 0; i < pi.Length - 1; i++)
array[int.Parse(pi[i].ToString()), int.Parse(pi[i + 1].ToString())]++;
// Смотрим максимум
int im = 0, jm = 0;
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
if (array[im, jm] < array[i, j])
{
im = i; jm = j;
}
Console.Write("{0}{1}: {2} раза", im, jm, array[im, jm]);
Console.ReadKey();
Скачать: PiPi.zipНайдите произведение всех простых чисел, заключенных между числами 1000000 и 2000000, по модулю 23. Опишите ход решения. Открыть спойлер Закрыть спойлер Решение: В итоге у нас должно получится некое число <произведение простых чисел> mod 23. Проблема в том, что произведение получается гигантским и никакой тип данных не вместит такое число, поэтому нужно использовать следующее свойство: модуль произведения равен модулю произведения модулей каждого множителя, т.е. если а*b=c, то ((а mod 23)*(b mod 23) mod 23) = c mod 23
Ищем первое простое число, считаем его модуль по 23, ищем следующее простое число, считаем его модуль, перемножаем с предыдущим, считаем модуль этого произведения, берём следующее простое число и т.д. (Хотя хрен его знает, я неуверен, есть ли такое свойство на самом деле)
Для нахождения простых чисел я волспользовался алгоритмом Решето Аткина, скорость выполнения которого меньше 0.15 секунд (для N < 10 000 000).
Исходный код (C#):class Program
{
static void Main(string[] args)
{
Atkin a = new Atkin(2000000);
int i = 1000000, res = 1;
while (i < 2000000)
{
if (a.IsPrimes[i]) res = (res * (i % 23)) % 23;
i++;
}
Console.Write(res);
Console.ReadLine();
}
}
public class Atkin
{
internal readonly int _limit;
public bool[] IsPrimes;
public Atkin() { return; }
public Atkin(int limit)
{
_limit = limit;
FindPrimes();
}
public void FindPrimes()
{
IsPrimes = new bool[_limit + 1];
double sqrt = Math.Sqrt(_limit);
if (sqrt < 29301)
{
for (int x = 1; x <= sqrt; x++)
for (int y = 1; y <= sqrt; y++)
{
int x2 = x * x;
int y2 = y * y;
int n = 4 * x2 + y2;
if (n <= _limit && (n % 12 == 1 || n % 12 == 5))
IsPrimes[n] ^= true;
n -= x2;
if (n <= _limit && n % 12 == 7)
IsPrimes[n] ^= true;
n -= 2 * y2;
if (x > y && n <= _limit && n % 12 == 11)
IsPrimes[n] ^= true;
}
for (int n = 5; n <= sqrt; n += 2)
if (IsPrimes[n])
{
int s = n * n;
for (int k = s; k <= _limit; k += s)
IsPrimes[k] = false;
}
}
else
{
var limit = (ulong)_limit;
for (ulong x = 1; x <= sqrt; x++)
for (ulong y = 1; y <= sqrt; y++)
{
ulong x2 = x * x;
ulong y2 = y * y;
ulong n = 4 * x2 + y2;
if (n <= limit && (n % 12 == 1 || n % 12 == 5))
IsPrimes[n] ^= true;
n -= x2;
if (n <= limit && n % 12 == 7)
IsPrimes[n] ^= true;
n -= 2 * y2;
if (x > y && n <= limit && n % 12 == 11)
IsPrimes[n] ^= true;
}
for (ulong n = 5; n <= sqrt; n += 2)
if (IsPrimes[n])
{
ulong s = n * n;
for (ulong k = s; k <= limit; k += s)
IsPrimes[k] = false;
}
}
IsPrimes[2] = true;
IsPrimes[3] = true;
}
}
Скачать: SimplePipka.zipКакая дата наступит через 16385 дней после 21 декабря 2012 года? Например, через 1 день после 1 января 2010 года наступит 2 января 2010 года. Ответ запишите в виде год (4 цифры), месяц (2 цифры), день (2 цифры), разделяя их дефисом, например 2010-01-02. Опишите, каким образом был получен ответ. Открыть спойлер Закрыть спойлер Решение:
На самом деле, эта задача решается на C# в одну строчку:
Console.Write(new DateTime(2012, 12, 21).AddDays(16385));
Ответ: 31.10.2057
Но каким образом сделать это "вручную" не интересовался. Вот такие пироги) Изменено Ксакеп (27.07 / 17:03) (всего 1 раз)
Прикрепленные файлы: PiPi.zip (3.89 кб.) Скачано 31 раз SimplePipka.zip (3.42 кб.) Скачано 40 раз |