Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2018, 03:45   #1
Александр121
Форумчанин
 
Регистрация: 17.09.2017
Сообщений: 265
По умолчанию

не правильное работает

если подать такие числа то работает не верно
input
3
4 5 2 49 4 5
4 3 2 7 2 11
4 2 2 49 32 2

output
3 2 1 должен быть
мой вывод 3 1 2


Тут задача возводить в степень и потом сравнить числа их вывести индекса
возведение в степень идёт с конца
2 2 3 4
возводится как 3^4 = 81
Теперь 2^81 = 2417851639229258349412352


input при этом тесте верно
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

output
2 4 3 6 7 5 9 10 1 8





Код:
#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;
}
я думаю ошибка из-за погрешности можете её минимизировать?

Последний раз редактировалось Вадим Мошев; 03.06.2018 в 19:43.
Александр121 вне форума Ответить с цитированием
Старый 03.06.2018, 12:24   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Цитата:
Сообщение от Александр121 Посмотреть сообщение
Код:
class tower_t {
public:
	int num; // номер башни
	int height; // высота башни
	double val[11]; // содержимое
	double cache[11]; // кэш для ускорения расчета
- как вариант, заменить тип с double на long double в строках val[11] и cache[11]. Ну как? Сработало? Заработал я 200(руб.)?
Цитата:
Сообщение от Александр121 Посмотреть сообщение
Код:
double head(int level) {
- связанная строка, поэтому тоже надо исправить double на long double.
И еще файл in забыли закрыть. Поэтому в конце нужно написать:
Код:
in.close();
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.

Последний раз редактировалось Cuprum5; 03.06.2018 в 14:35. Причина: Добавил фразу.
Cuprum5 вне форума Ответить с цитированием
Старый 03.06.2018, 21:07   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Шаманство всё это. Подбор под конкретные данные
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доработать код C++ SadGrizzly Фриланс 9 30.10.2015 09:42
Доработать код alex1808 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 18.12.2011 20:30
доработать готовый код с++ pametol Фриланс 3 02.07.2011 09:50
Доработать код ferrum88 Помощь студентам 0 23.11.2010 20:14
Доработать код Микки Microsoft Office Excel 7 31.03.2009 13:12