Доработать программу
ввод с помощью этого теста является истинным
10 # количество цифр в нижней части
4 2 2 2 2 2 # Первая цифра число градусов в этой строке -1
1 2 2
1 3 2
1 2 3
3 2 2 2 2
2 2 2 2
1 3 3
3 3 3 3 3
2 4 3 3
2 2 3 4
выход
2 4 3 6 7 5 9 10 1 8
Здесь задача состоит в том, чтобы поднять до степени, а затем сравнить их числа, чтобы вывести индекс в порядке возрастания чисел
возведение в степень происходит с конца
2 2 3 4
поднимается как 3 ^ 4 = 81
Теперь 2 ^ 81 = 2417851639229258349412352
если вы отправляете такие номера, он работает неправильно
вход
3
4 5 2 49 4 5
4 3 2 7 2 11
4 2 2 49 32 2
выход
3 2 1 должно быть
мой вывод 3 1 2
#include <fstream> #include <algorithm> #include <stdio.h> #include <math.h> using namespace std; class tower_t { public: int num; int height; double val[11]; // содержимое double cache[11]; // кэш для ускорения расчета // Конструктор tower_t() { for (int i = 0; i < 11; i++) { val[i] = 1; cache[i] = 0; } height = 0; } // Тройной логарифм верхних 3-х уровней double head(int level) { if(cache[level] == 0) cache[level] = (log2(log2(val[level])) + log2(val[level + 1]) * val[level + 2]); return cache[level]; } // Вычисление верхушки до тех пока влазит в double void normalize() { while(height > 1 && (log2(val[height - 2]) * val[height - 1]) < 50) { val[height - 2] = pow(val[height - 2], val[height - 1]); val[height - 1] = 1; height--; } } // Вывод для отладки void print() { #ifdef _DEBUG printf("%2d: {", num); for (int i = 0; i < height; i++) { if (i > 0) printf(", "); if(val[i] < 1000000000) { printf("%0.0f", val[i]); } else { printf("%0.3e", val[i]); } } printf("}\n"); #endif } }; // сравнение двух bool compare(tower_t& t1, tower_t& t2) { // этаж с которого сравнивать три последних уровня int level = ((t1.height > t2.height) ? t1.height : t2.height) - 3; if (level < 0) level = 0; if(t1.height == t2.height) { // если одной высоты, сравниваем поэтажно for (int i = t1.height - 1; i >= 0; i--) { if (abs(t1.val[i] - t2.val[i]) > (t1.val[i] * 1e-14)) { if (i < level) { // верхи совпали ниже level return t1.val[i] < t2.val[i]; } break; } } } return t1.head(level) < t2.head(level); } int main() { // Считывание задания ifstream in ("input.txt"); int cnt; in >> cnt; tower_t* towers = new tower_t[cnt]; for (int i = 0; i < cnt; i++) { int len; in >> len; towers[i].num = i + 1; bool write = true; for (int j = 0; j <= len; j++) { int val; in >> val; if (val <= 1) write = false; // если уровень <= 1 то выше не читать if(write) { towers[i].val[j] = val; towers[i].height = j + 1; } } towers[i].print(); towers[i].normalize(); } // Сортировка sort(towers, towers + cnt, compare); // Вывод результата ofstream out("output.txt"); for (int i = 0; i < cnt; i++) { out << towers[i].num << " "; towers[i].print(); } out << endl; out.close(); delete[] towers; return 0; }
Что я уже пробовал:
теория чисел - класс сложности сравнения энергетических башен - математический обмен стеками[^]
Patrice T
Объяснение ваших проблем также является навыком