Где еще можно изучать Python кроме в pythontutor.ru и как надо изучать? И по каким учебникам стоит заниматься?
А какая цель изучения?
моя цель - участвовать на олимпиадах по программированию
Вообще, для изучения пайтона я бы порекомендовал небольшой курс от MIT
Но для олимпиад кажется лучше изучать языки более низкого уровня, а на каком этапе можно уходить с пайтона на них лучше @Zhabka пусть скажет.
Есть курс на stepik классный
Но для олимпиад особо питон не рекомендуется, т.к. он банально медленее, но его знание тебе безусловно поможет, т.к. с его помощью можно написать например что то в длинной арифметике за пару строк, что на том же С++ ты бы писал очень долго.
Вот пример:
Длинная арифметика, если a и b к примеру больше, чем 10^100
С++:
#include<bits/stdc++.h>
using namespace std;
string apb(string x, string y)
{
while(x.size() < y.size())
x = '0' + x;
while(x.size() > y.size())
y='0' + y;
long long a, b, k = 0, i;
string s = "";
for(i = x.size() - 1; i>=0; i--)
{
a=int(x[i])-48;
b=int(y[i])-48;
s=char((a+b+k)%10+48)+s;
k=(a+b+k)/10;
}
if(k==1)s='1'+s;
return s;
}
string axb(string x, long long y)
{
long long a, b, i, k = 0, j = 0;
string sa = "", t = "", s = "";
while(y > 0)
{
k = 0;
b = y % 10;
j ++;
s = "";
for(i = x.size() - 1; i >= 0; --i)
{
a = ((int(x[i]) - 48) * b + k);
k = a / 10;
s = char(a % 10 + 48) + s;
}
if (k != 0)s = char(k + 48) + s;
s += sa;
t = apb(t, s);
sa += '0';
y /= 10;
}
if(t[0] == '0')t = "0";
if(t == "")t = "0";
return t;
}
string nf(long long n)
{
if(n > 1)
{
return axb(nf(n - 1), n);
}
else
return "1";
}
string a;
long long n, b;
int main()
{
cin >> a >> b ;
cout << axb(a, b);
}
# на питоне
a = b = int(input())
print(a * b)
Питон подойдёт только для начала, если до этого уже занимался прогой то сразу используй c++,если нет то можешь с помощью любого курса узнать базовые вещи в проге, после базовых вещей начинай решать задачи(на acmp.ru много задач для начинающих), не знаешь как что-то реализовать гуглишь/спрашиваешь на аске.
Ну и питон на школьных олимпиадах вроде использовать не получится, начиная с области можно использовать только c++
(Про то, что питона нет на области)
Хз, у нас область на КФе была и там все языки доступны были, даже хаскелл
Ну я до этого вообще не занимался программированием
Тогда на респе не было питона
А че за ужас здесь творится? Че происходит?
Ну тип в плюсах числа хранятся в 16,32 или 64 битах. А в питоне если я не ошибаюсь единственное ограничение это количество свободной памяти.
Но на самом деле длинка почти бесполезна на школьных олимпиадах, а вне школьных олимпиад почти всегда можно приносить с собой готовую реализацию
и поэтому числа сначала конвертируется в строки, которые потом складываются?
Для того чтобы делать это на плюсах необязательно конвертировать в строки(но тут он так делал), а то как на питоне большие числа складываются я не знаю.
а че надо сделать?
Тогда питон отменяется, очень простое решение. Конечно, чисто теоретически можно попытаться прожить на нем, но это как стрелять себе в ногу, крайне нежелательно. Причины? Во-первых, зачастую авторские решения пишутся только на C++, и нередки случаи, когда на питоне ввиду его малой производительности решить задачу банально нельзя. Во-вторых, как мне кажется юзать более низкоуровневый язык очень полезно для понимания работы программы, мб это спорно но на питоне очень много вещей прячутся в “черную коробку” и для новичка непонимание таких вещей вредно
Хранить массив чисел A, первые 32 цифры будут храниться в A_0, следующие 32 цифры будут храниться в A_1 и т.д. , пусть n длина чисел которые мы храним. Тогда операция сложения будет работать за n/32 действия, а умножение будет работать за n^2/1024 действий(если я не туплю). Так как умножение слишком долгое обычно используют Быстрое Преобразование Фурье с помощью которого можно быстро умножать два многочлена.
Зависит от человека, на самом деле. Если вы готовы потянуть менее интуитивный язык с большими заморочками – смело изучайте низкоуровневые.
Но есть просто люди, которые не потянут низкоуровневый в качестве первого и если выбор между “да катись оно все к фигам” и “войти во вкус на питоне, а потом перейти на плюсы”, то лучше, наверное (наверное), второй вариант
Ну и на самом деле можно просто взять и один раз написать(или скопировать) готовую структуру для всего этого, а потом просто пользоваться ею.
Там же вроде очень сложно уменьшить асимптотичность умножения, кажется есть какие-то хитрые алгоритмы, которые максимум до O(n^{3/2}) понижают или сколько-то, но буквально чуть меньше, чем O(n^2).
Это алгоритм Карацубы который работает за O(n^{log_2({3})})
Я там упомянул БПФ, с помощью которого можно умножать числа за O(nlogn)
(Идея очень прикольная и понятная)