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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2013, 17:11   #1
RIKISHI007
Пользователь
 
Регистрация: 04.07.2013
Сообщений: 27
Восклицание Прошу помочь. 2^N. Не получается

http://acmp.ru/?main=task&id_task=40

Извините, возможно я дурак, но почему у меня не работает код к задаче 2^N. При N = 1000 выводит 302 цифры, все как положено. Ошибка на 3 тесте

Код:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int P = 0;
    cin >> P;
    cout <<  setiosflags(ios_base::fixed )  << setprecision(0) << pow(2, P) ;



}

и еще один вопрос: Если ли разница в быстродействии между

Код:
#define N pow(2, P)
cout << N;
#undef N
и например

Код:
long double N = pow(2, P);

cout << N;

?????
RIKISHI007 вне форума Ответить с цитированием
Старый 05.08.2013, 19:32   #2
RIKISHI007
Пользователь
 
Регистрация: 04.07.2013
Сообщений: 27
По умолчанию

0 ответов, ну может кто-нибудь поможет(
RIKISHI007 вне форума Ответить с цитированием
Старый 05.08.2013, 20:14   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
и еще один вопрос: Если ли разница в быстродействии между
первый вариант будет заменен препроцессором на
cout << pow(2, P);
при этом будет создаваться временный объект, в который поместиться результат работы функции. Объект будет уничтожен сразу после выполнения <<.

Во втором случае тоже самое, но выполнится присваивание (скорее всего компилятор оптимизирует это до того, что присваивания не будет - будет что-то типа перемещения). - если не оптимизирует то да - во втором варианте выполняется лишнее присваивание.

Разница лишь в том, что во втором результат сохраняется не во временном объекте, который не сразу уничтожается.

pow(2, P) работает эпически медленно (ведь pow не знает что у вас там 2 и что P - целое, он кастует их в double и возводит дробное число в дробную степень - а это очень сложная операция -поэтому и ошибка). Тут не надо использовать pow - ищите другое решение, которое я (и надеюсь другие форумчане тоже) не подскажу - а-то испорчу вам обучение ))

Цитата:
0 ответов, ну может кто-нибудь поможет(
слишком быстрый )
rrrFer вне форума Ответить с цитированием
Старый 05.08.2013, 20:21   #4
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Код:
#include <math.h>
#include <stdio.h>

int main(void){
	float p;
	fscanf(fopen("input.txt", "r"), "%f", &p);
	fprintf(fopen("output.txt", "w"), "%f", pow(2, p));
	
	return 0;
}
быстрее наверное будет так:
Код:
double power(int p){
	switch(p){
		
		case 1: return 2.0;
		
		case 2:	return 4.0;
		
		case 3: return 8.0;
		
		//.......
		
		//и так хоть до 1 000 000		
	}
	
	return 1;
}
Цитата:
и надеюсь другие форумчане тоже
RIKISHI не слушай этого маразматика, его жаба душит делиться мозгом.
do not use your brain

Последний раз редактировалось Stilet; 05.08.2013 в 21:01.
Кащей вне форума Ответить с цитированием
Старый 05.08.2013, 20:40   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

фигня в задачке в том, что требуется получить точный ответ, а максимальный точный при использовании стандартных типов (т.е. unsigned longlong) - 2^64-1, что уже меньше 2^72 из примера.
При использовании же даблов идет округление и могут случится самые странные погрешности.

Зы:
Цитата:
Сообщение от Кащей Посмотреть сообщение
быстрее наверное будет так:
Код:
double power(int p){
	switch(p){		
		case 1: return 2.0;
		//.......
		
		//и так хоть до 1 000 000		
	}	
	return 1;
}
Нубский вопрос: а как работает свитч, через двоичный поиск или прямым перебором?

Последний раз редактировалось Smogg; 05.08.2013 в 20:51.
Smogg вне форума Ответить с цитированием
Старый 05.08.2013, 20:52   #6
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

1267650600228229401496703205376.000 000
1,2676506×10³⁰

первое число - программа, второе калькулятор.
стандартных типов - а чем тебе тип с плавающей точкой не стандартный вдруг?
да и в условии нигде не сказано что вывод должен быть какого либо определённого типа.
do not use your brain

Последний раз редактировалось Кащей; 05.08.2013 в 21:00.
Кащей вне форума Ответить с цитированием
Старый 05.08.2013, 21:16   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Вобщем, я думаю, что тут таки должно хватить стандартного long double (я получил с ним верный ответ для n = 1000 и для n = 2000 тоже), но ты ведь знаешь что на разных архитектурах у него разные диапазоны, и я хз на чем там acmp работает - но им такое решение не походит (на 3 тесте) :
Код:
long double f(int n) {
  if (n == 0) return 1;
  double t1 = f(n / 2);
  if (n & 1) return t1 * t1 * 2;
  return t1 * t1;
}
Ну ты видишь, что в худшем случае тут выполнится 2*log2(n) умножений. В твоем случае он должен работать бесконечно быстрее pow, но он не канает acmp, поэтому я им делюсь ))

Цитата:
При использовании же даблов идет округление и могут случится самые странные погрешности.
может быть, но тут делается не так много умножений, чтобы получить такие погрешности, ИМХО, но тесты не проходят, значит, Вы правы )).

acmp ждет длинку и т.к. n тут не большое - можно тупо последовательно умножать на 2 (даже тыщу раз) - такое решение acmp принимает (я проверил).
rrrFer вне форума Ответить с цитированием
Старый 05.08.2013, 21:16   #8
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
а как работает свитч
Я могу только предполагать и в зависимости от ответа форумчан предположение либо подтвердится либо нет, а пока ничего не скажу по тому как не уверен.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 05.08.2013, 21:16   #9
RIKISHI007
Пользователь
 
Регистрация: 04.07.2013
Сообщений: 27
По умолчанию

Я написал, у меня идет даже 2^1000 и 302 символа все как надо, админ говорит не принимаю, я писал на g++ у них стоит Vc++,

скрины:

http://f3.s.qip.ru/10bCiROzf.jpg

http://f3.s.qip.ru/10bCiROzh.jpg

http://f4.s.qip.ru/10bCiROzi.jpg

http://f3.s.qip.ru/10bCiROzj.jpg
RIKISHI007 вне форума Ответить с цитированием
Старый 05.08.2013, 21:17   #10
RIKISHI007
Пользователь
 
Регистрация: 04.07.2013
Сообщений: 27
По умолчанию

Это к вопросу о том, что типо дальше 2^72 не идет
RIKISHI007 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритмы. Не прошу решить. Прошу помочь! pascaluser Паскаль, Turbo Pascal, PascalABC.NET 2 12.10.2012 08:45
Прошу помочь lazarewoleg HTML и CSS 2 16.08.2012 12:18
Прошу помочь) Егоргий Помощь студентам 3 03.06.2012 20:34
Прошу помочь! DeusGPZ Общие вопросы C/C++ 4 17.10.2011 13:01