В задаче имеется "топорное решение" — посчитать напрямую. Получившееся число будет восьмизначным, что не так уж и страшно, если в голову не приходят другие решения.
Рассмотрим, однако, решение, которое позволит делать подобные задачи без прямого подсчёта. Для этого, прежде всего, переведём всё в степени тройки:
Как представляется число 3n в троичной системе счисления? Давайте подумаем, как мы переводим из десятичной системы в троичную? Сначала делим на 3, затем частное делим на 3, затем новое частное на 3 и т.п. Что получится в случае деления 3n на 3? Очевидно, что 3n-1. А если его поделить дальше на 3, то получится 3n-2. Если так сделать n раз, то в конце останется 30, то есть. Таким образом, это будет число 100..00, где количество нулей равно n.
То есть, например, 8-ая степени тройки в троичной системе представима в виде 1000000003. А 35 — это 1000003.
Вернёмся теперь к нашей сумме. Давайте сначала в столбик сложим 316 и 35 в троичной системе счисления.
Теперь остаётся из этого вычесть 32. Для этого придётся "занять" разряд. Но принцип тут такой же, как и в обычной, десятичной системе счисления, только 0 будут превращаться не в 9, а в 2 (самую большую цифру в троичной системе счисления:
void printArray(int *array, int length) { for (int i=0;i<length;i++) std::cout<<std::setw(4)<<array[i]; std::cout<<std::endl; }
int main() { srand(time(0)); int length; std::cin>>length; int *array=new int[length]; for (int i=0;i<length;i++) array[i]=rand()%100+1; printArray(array,length); int posMax=0; for (int i=1;i<length;i++) if (array[posMax]<array[i]) posMax=i; bool flag=false; while (flag==false) { flag=true; for (int i=posMax+2;i<length;i++) if (array[i]<array[i-1]) { flag=false; swap(array[i],array[i-1]); } } printArray(array,length); return 0; }
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota
Оформи подписку