Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
#1

Подскажите в чем разница - C++

24.06.2012, 15:25. Просмотров 531. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <fstream>
#include <cmath>
using namespace std;
 
int main()
{
    ifstream x("INPUT.TXT");
    ofstream d("OUTPUT.TXT");
 
    int y, n;
 
    x >> n;
    y = pow(2, n);
 
    d << (y-n-1);
}
Этот код проходит все тесты.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
#include <cmath>
using namespace std;
 
int main()
{
    ifstream x("INPUT.TXT");
    ofstream d("OUTPUT.TXT");
 
    int  n;
 
    x >> n;
 
    d << (pow(2, n)-n-1);
}
А этот код дает WA на одном из тестов.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2012, 15:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подскажите в чем разница (C++):

в чем разница? - C++
вот такая вот конструкция (условие)?ложь:истина дает такой же результат if(условие){истина}else{ложь} хотелось бы...

В чем разница. - C++
Извиняюсь за тупой вопрос, но в чем разница. оператора ++ к примеру. a=b++ и a=++b ?

В чем разница - C++
В чем разница между: typedef double(*Function_ptr)(double); и typedef double Function(double); Первое - это указатель на...

В чем разница? - C++
Скажите в чем разница между двумя кусками кода: std::string a; while ((std::cin&gt;&gt;a)!=&quot;Quit&quot;) { std::cout&lt;&lt;a; ...

В чем разница? - C++
Здравствуйте! Хотел узнать, в чем разница между С++ которым писали в старом добром BorlandC, в студии и VisualC++? Думал тем, что...

'0' и 0, в чем разница? - C++
Подскажите пожалуйста, если я напишу число в ' ' или число без кавычек, то что изменится? Код элемента(цифры)? И для чего это нужно? ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 908
24.06.2012, 15:26 #2
sievmi, Так надо)
0
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
24.06.2012, 15:28  [ТС] #3
Цитата Сообщение от Invader_Zim Посмотреть сообщение
sievmi, Так надо)
Но все же в чем разница их работы ?
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
24.06.2012, 15:32 #4
В первом случае результат получается типа int, во втором типа double. При выводе большого значения double выводится в научном формате: 2.14748e+09
А вообще pow(2, n) правильнее было бы заменить на
C++
1
(1 << n)
1
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
24.06.2012, 15:43  [ТС] #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
А вообще pow(2, n) правильнее было бы заменить на
C++
1
(1 << n)
Спасибо, все работает, но есть пара вопросов.
Я в C++ новичок совсем и что-то не понял как работает ваша инструкция(но работает она отлично ),
насколько я знаю "<<" это оператор вывода и это меня совсем сбило.
И еще вопрос, почему ее лучше использовать чем pow(2, n) ?
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
24.06.2012, 15:59 #6
Изначально, ещё в Си, оператор << означал битовый сдвиг числа влево. То есть (a << 3) означает, что битовое представление числа a надо сдвинуть влево на 3 разряда (правые заполняются нулями). Сдвиг на один разряд влево эквивалентен умножению на 2. Сдвиг на n разрядов эквивалентен n-кратному умножению на 2, или умножению на 2 в степени n.
Это уже потом, в C++, этот оператор был переопределён для потоков как операция вывода.
Цитата Сообщение от sievmi Посмотреть сообщение
И еще вопрос, почему ее лучше использовать чем pow(2, n) ?
Если результат укладывается в целочисленный тип, то это быстрее, чем функция pow(). Если же результат не умещается в целочисленной переменной, то тогда выбора нет, придётся использовать pow(), которая выдаёт результат типа double.

Добавлено через 8 минут
Пожалуй поясню ещё такую строку:
C++
1
d << (1 << n)-n-1;
Здесь второй << является оператором сдвига, а первый оператором вывода в поток. Отличаются они в данном случае левым операндом. У первого оператора слева стоит объект потока вывода, а у второго слева и справа значения целочисленного типа. Вот именно по разным типам операндов эти операторы и различаются компилятором. Это называется перегрузка функций.
1
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
24.06.2012, 16:02  [ТС] #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Изначально, ещё в Си, оператор << означал битовый сдвиг числа влево. То есть (a << 3) означает, что битовое представление числа a надо сдвинуть влево на 3 разряда (правые заполняются нулями).
Тоесть если я перед оператором << напишу число, то он работает уже как оператор битового сдвига, а не оператор вывода?
Получается если << сдвигает влево, то >> вправо ?

И еще вопрос : Почему (1 << n ) нужно обязательно в скобки заключать? Без них ошибка при компиляции.

Добавлено через 1 минуту
Цитата Сообщение от grizlik78 Посмотреть сообщение
Здесь второй << является оператором сдвига, а первый оператором вывода в поток. Отличаются они в данном случае левым операндом. У первого оператора слева стоит объект потока вывода, а у второго слева и справа значения целочисленного типа. Вот именно по разным типам операндов эти операторы и различаются компилятором. Это называется перегрузка функций.
Извиняюсь, пока ответ на ваш прошлый пост писал не заметил нового )
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
24.06.2012, 16:05 #8
Цитата Сообщение от sievmi Посмотреть сообщение
Получается если << сдвигает влево, то >> вправо ?
Да.
Цитата Сообщение от sievmi Посмотреть сообщение
И еще вопрос : Почему (1 << n ) нужно обязательно в скобки заключать? Без них ошибка при компиляции.
А как выглядит строка кода с ошибкой?
0
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
24.06.2012, 16:09  [ТС] #9
Поторопился написать, не ошибка а предупреждение, но все же.

Строка вот:
C++
1
d << (1<<n-n-1);
А сообщение компилятора вот:
warning: left shift count is negative
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
24.06.2012, 16:12 #10
У оператора << приоритет меньше, чем у арифметических, сначала выполняется вычитание, потом сдвиг.
Получается недопустимое выражение (1 << -1), компилятор это заметил и известил.
1
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.06.2012, 06:50 #11
Цитата Сообщение от sievmi Посмотреть сообщение
Тоесть если я перед оператором << напишу число, то он работает уже как оператор битового сдвига, а не оператор вывода?
Более того, и в С++ этот оператор остался оператором побитового сдвига. Просто для класса std::ostream оператор сдвига влево << перегружен для получения другого эффекта. Но оператор этот (с технической точки зрения) нельзя назвать оператором вывода. С пользовательской точки зрения - можно.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2012, 06:50
Привет! Вот еще темы с ответами:

В чем разница - C++
Здравствуйте. Я новичок, как здесь, так и в программировании, только учусь. И ищя литературу прочитывал кучу информации, наткнулся на этот...

В чем разница между X x; и X x()? - C++
Корректный ли этот ответ?

Шаблоны. В чем разница? - C++
В чем разница между этими объявлениями? Вроде и так можно и этак. А как правильней? template &lt;class T&gt; struct list { T value; ...

В чем разница между [] и * ? - C++
Думал, что ни в чем, но когда попытался сделать так: (в файле 1) char lc; в файле 2: extern char* lc; Компилятор ругаться не стал,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.06.2012, 06:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru