tag:blogger.com,1999:blog-9149260308162775442.post3314583746383105409..comments2023-11-06T20:57:53.318+03:00Comments on Алгоритмы на С++ (олимпиадный подход): Вывод длинных чиселslipstak2http://www.blogger.com/profile/15957109470497214310noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-9149260308162775442.post-56755581209534902732014-03-25T11:34:05.837+04:002014-03-25T11:34:05.837+04:00основание в 9 знаков(1e9) используется как правило...основание в 9 знаков(1e9) используется как правило для сложения и/или вычитания. Это связано с тем, что промежуточные вычисления не будут превышать 2e9, что укладывается в знаковый int(4 байта). Если же речь идет об умножении, то здесь максимальная основание стоит брать как 1e4, чтобы промежуточные вычисления укладывались в 1e8.<br /><br />Если в качестве основания использовать степень двойки и хранить все в int, то максимальное основание будет 2^30 для знакового int и 2^31 для беззнакового. Это относится к операции сложения. Для умножения можете аналогично подсчитать, как это сделано для основании в виде степени десятки. Оперируя основание в виде степени двойки нужно подумать наперед о быстром переводе этого числа в нужную систему счисления. Тут на помощь могут прийти подходы перевода числа из 16/8/4- ричной системы в двоичную.slipstak2https://www.blogger.com/profile/15957109470497214310noreply@blogger.comtag:blogger.com,1999:blog-9149260308162775442.post-20014044044082880682014-03-24T14:13:55.924+04:002014-03-24T14:13:55.924+04:00На e-maxx увидел, что основание сс = 1000000000, т...На e-maxx увидел, что основание сс = 1000000000, т.е хранят по 9 элементов. А возможна ли реализация с основанием сс 2^32? И много ли придется поменять в арифметических операциях?Anonymoushttps://www.blogger.com/profile/16582831722388064325noreply@blogger.comtag:blogger.com,1999:blog-9149260308162775442.post-70228818917469642152014-03-24T14:11:32.845+04:002014-03-24T14:11:32.845+04:00Этот комментарий был удален автором.Anonymoushttps://www.blogger.com/profile/16582831722388064325noreply@blogger.comtag:blogger.com,1999:blog-9149260308162775442.post-21893120266221466842014-01-29T10:11:54.610+04:002014-01-29T10:11:54.610+04:00Можно и так. Дело вкуса. От себя могу добавить, чт...Можно и так. Дело вкуса. От себя могу добавить, что использование функции pow для работы с целыми числами - плохая идея. Если очень хочется много оперировать степенями какого-либо целого числа N, то лучше заранее подготовить массив, например такой: _pow[i] = N^i. Размеры массива будут невелики, прекалк не займет много времени, зато потом возведение числа в степень будет работать за O(1)slipstak2https://www.blogger.com/profile/15957109470497214310noreply@blogger.comtag:blogger.com,1999:blog-9149260308162775442.post-21833086385956795852014-01-28T22:27:38.660+04:002014-01-28T22:27:38.660+04:00или так через cout:
cout<<setw(len)<<s...или так через cout:<br />cout<<setw(len)<<setfill('0')<<v[i];martinhttps://www.blogger.com/profile/17570975766984838745noreply@blogger.comtag:blogger.com,1999:blog-9149260308162775442.post-46657269888343838442014-01-28T13:56:13.722+04:002014-01-28T13:56:13.722+04:00Все содержимое Вашего цикла можно заменить на prin...Все содержимое Вашего цикла можно заменить на printf("%04d", v[i]) (len=10000), что, собственно, и реализовано в нашем примере. Ваш вариант очень громоздкий, да и работает в несколько раз дольше.Danilhttps://www.blogger.com/profile/09911645882342738576noreply@blogger.comtag:blogger.com,1999:blog-9149260308162775442.post-3138339225595962422014-01-28T13:24:02.051+04:002014-01-28T13:24:02.051+04:00При наличии подпоследовательностей с нулями может ...При наличии подпоследовательностей с нулями может лучше цикл во втором выводе реализовать так:<br /><br />for (int i=v.size()-2;i>=0;i--) {<br /> int len2=len;<br /> if (!v[i]) <br /> while(--len2) cout<<0;<br /> else<br /> while (v[i]<pow(10.0,--len2)) cout<<0;<br /> cout<<v[i];<br /> }<br /><br />(у меня v - вектор)martinhttps://www.blogger.com/profile/17570975766984838745noreply@blogger.com