11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
1

Меняется ответ при приведении функции pow к unsigned long long

25.08.2017, 14:46. Показов 1571. Ответов 8
Метки нет (Все метки)

Тест:
Кликните здесь для просмотра всего текста
50 50
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1

Вот так ответ правильный
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
 
//#define f first
//#define s second
 
typedef long long ll;
typedef unsigned long long ull;
 
using namespace std;
 
vector<vector<int> > a;
int n, m;
 
int main () {
  cin >> n >> m;
  a.resize(n, vector<int>(m, 0));
  vector<ull> row(2, 0), col(2, 0);
  for (int i = 0; i < n; i++) {
    int nul = 0, one = 0;
    for (int j = 0; j < m; j++) {
      cin >> a[i][j];
      if (a[i][j] == 0) nul++; else one++;
    }
    row[0] += (ull)pow(2, nul) - 1, row[1] += (ull)pow(2, one) - 1; //Основные подсчёты
  }
  for (int j = 0; j < m; j++) {
    int nul = 0, one = 0;
    for (int i = 0; i < n; i++) {
      if (a[i][j] == 0) nul++; else one++;
    }
    col[0] += (ull)pow(2, nul) - 1, col[1] += (ull)pow(2, one) - 1; //Основные подсчёты
  }
  ull ans;
  ans = col[0] + col[1] + row[0] + row[1] - n * m; //Основные подсчёты
  cout << ans << endl;
  return 0;
}
А вот так на 82 больше

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
 
//#define f first
//#define s second
 
typedef long long ll;
typedef unsigned long long ull;
 
using namespace std;
 
vector<vector<int> > a;
int n, m;
 
int main () {
  cin >> n >> m;
  a.resize(n, vector<int>(m, 0));
  vector<ull> row(2, 0), col(2, 0);
  for (int i = 0; i < n; i++) {
    int nul = 0, one = 0;
    for (int j = 0; j < m; j++) {
      cin >> a[i][j];
      if (a[i][j] == 0) nul++; else one++;
    }
    row[0] += pow(2, nul) - 1, row[1] += pow(2, one) - 1; //Основные подсчёты
  }
  for (int j = 0; j < m; j++) {
    int nul = 0, one = 0;
    for (int i = 0; i < n; i++) {
      if (a[i][j] == 0) nul++; else one++;
    }
    col[0] += pow(2, nul) - 1, col[1] += pow(2, one) - 1; //Основные подсчёты
  }
  ull ans;
  ans = col[0] + col[1] + row[0] + row[1] - n * m; //Основные подсчёты
  cout << ans << endl;
  return 0;
}
Почему так?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2017, 14:46
Ответы с готовыми решениями:

Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p
Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в...

Не понятный undefined reference to `unsigned long long f<unsigned long long, void>
test.cpp: #include &lt;iostream&gt; template &lt;typename FormalType, typename FactType = typename...

Быстрое вычисление наибольшего общего делителя для unsigned long long int
Даны два числа типа unsigned long long int, в них могут оказаться любые представимые значения,...

Перевести long long unsigned int в массив char
Подскажите, пожалуйста, как превратить число типа long long unsigned int в массив символов? Каждый...

8
1501 / 803 / 175
Регистрация: 05.12.2015
Сообщений: 2,391
25.08.2017, 15:06 2
SaynorPRO,
Какое внутреннее представление вещественных типов?
Что выведет следующий код?
C++
1
2
3
double a = 1e100;
double b = a + 1;
std::cout<<(a==b);
Идем дальше
C++
1
2
3
4
double a = 1.0
unsigned long long b = 1;
auto c = a + b; // Какой тип у с ???
auto d = (unsigned long long)a + b; // какой тип у d ???
Не считайте степени двойки с помощью pow().
0
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
25.08.2017, 19:12  [ТС] 3
avgoor,
Цитата Сообщение от avgoor Посмотреть сообщение
Что выведет следующий код?
Вывело просто единицу.

Цитата Сообщение от avgoor Посмотреть сообщение
Идем дальше
А как я тут должен определить тип данных? Программно не знаю как, но если самостоятельно, судя по моим знаниям языка, то c - double, так как он точнее, а d - unsigned long long, потому что тут вариантов других нету.

Цитата Сообщение от avgoor Посмотреть сообщение
Не считайте степени двойки с помощью pow().
Почему с этой функцией pow() постоянно проблемы? То со степенями десятки, то уже со степенями двойки. Как оно может посчитать неправильно, если я его прошу просто умножать целое число? И самое главное, зачем она нужна, если она некорректно работает?
0
1501 / 803 / 175
Регистрация: 05.12.2015
Сообщений: 2,391
25.08.2017, 19:24 4
Цитата Сообщение от SaynorPRO Посмотреть сообщение
Вывело просто единицу.
Т.е. вас не смутило, что вы прибаляете единицу к числу, а оно не меняется? Точность double - не бесконечная, при достаточно больших числах младший разряд станет больше единицы.

Цитата Сообщение от SaynorPRO Посмотреть сообщение
если я его прошу просто умножать целое число
Просить бесполезно. pow() принимает и возвращает вещественные типы (а не целые). Есть быстрый способ получить степень двойки:
C++
1
2
3
int power 5;
int res = 1 << power;
std::cout << res;
1
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
25.08.2017, 19:56  [ТС] 5
Цитата Сообщение от avgoor Посмотреть сообщение
Т.е. вас не смутило, что вы прибаляете единицу к числу, а оно не меняется? Точность double - не бесконечная, при достаточно больших числах младший разряд станет больше единицы.
Да, действительно, я и не заметил.
Попробовал вывести эти числа:
100000000000000001590289110975991804683608085639452813897813 27557747838772170381060813469985856815104.000000
100000000000000001590289110975991804683608085639452813897813 27557747838772170381060813469985856815104.0000001

Два вопроса:
1. Откуда берёт компилятор числа те, что после нуля?
2. Тут видно, что вводимая вами операция(1e100 + 1) выполнилась, однако правильного сравнения не произошло. Каков тогда механизм сравнения тут? Где он даёт сбой?

Цитата Сообщение от avgoor Посмотреть сообщение
при достаточно больших числах младший разряд станет больше единицы.
Может, вы имели в виду больше нуля? Этим предложением вы описали вот этот ряд рандомных чисел после 16 нуля?
0
1501 / 803 / 175
Регистрация: 05.12.2015
Сообщений: 2,391
25.08.2017, 20:06 6
SaynorPRO, Загуглите представление вещественных чисел в памяти компьютера.
0
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
25.08.2017, 20:51  [ТС] 7
avgoor, но стойте, я так и не выяснил в чём корень моей проблемы. В границах типа double? Нет, ведь максимальное значение переменной nul или one - 50, а 2^50 прекрасно влазит в double. Потому что pow() работает с вещественными числами? Почему тогда простое приведение типа решает эту проблему? Сначала же считается число, а потом его приводят к моему типу, правильно? Как тогда это может решить проблему, если приведение тут - это по сути отсечение дробной части, а проблемы у меня наоборот - в целой.
0
1501 / 803 / 175
Регистрация: 05.12.2015
Сообщений: 2,391
25.08.2017, 21:03 8
Лучший ответ Сообщение было отмечено SaynorPRO как решение

Решение

Цитата Сообщение от SaynorPRO Посмотреть сообщение
а 2^50 прекрасно влазит в double
Влазит. Но, какое будет соседнее число от 2^50. В double влазит ограниченное число разрядов. Вы можете записать число в инженерной нотации, пусть 1*10^50. Чтобы записать следующее натуральное число надо написать так:
1.00000000000000000000000000000...01*10^50. В double нет столько разрядов. Еще раз: загуглите, как представляются вещественные типы в памяти компьютера.

Пока не выясните что такое мантисса и экспонента продолжать дискуссию не буду.
1
991 / 217 / 21
Регистрация: 20.05.2016
Сообщений: 951
Записей в блоге: 17
25.08.2017, 21:16 9
В точных целочисленных расчетах не использую pow() - посмотрите спецификацию этой функции и поймете почему. Для точного возведения в степень точнее будет перемножить unsigned long long нужное количество раз. Операции умножения будут целочисленные.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2017, 21:16

Работа с unsigned long long int на 32-битных системах
В программе испольуется тип данных unsigned long int, но в некоторых (хотя и очень редких) случаях...

Написать функцию, которая принимает два параметра типа unsigned long long и выводит их на экран
Я самое наглое , ленивое и бессовестное чудовище)) но тем не менее Напишите функцию, которая ...

Как преобразовать char[8] к unsigned long long?
Требуется выполнить преобразование char к unsigned long long и обратно

Тип unsigned long long
Добрый день. У меня возник вопрос: Почему в результате выполнения программы выводится число: -1?...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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