Форум программистов, компьютерный форум, киберфорум
Наши страницы
HighPredator
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Задачки для себя 0x01

Запись от HighPredator размещена 15.06.2016 в 14:20
Обновил(-а) HighPredator 29.06.2016 в 22:15
Метки c++11, c89, programming

1)Условие : Реализация многопоточного вычисления числа Pi
Говнокод:
Кликните здесь для просмотра всего текста
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <future>
 
double CalculatePi(const size_t iterationsCount)
{
  double pi = 0.0;
  double nominator = 1.0;
  double denominator = 1.0;
  
  for (size_t i = 0; i < iterationsCount; i++)
  {
    pi = pi + nominator / denominator;
    nominator = nominator * (-1.0);
    denominator = denominator + 2.0;
  }  
  pi = pi * 4.0;
  
  return pi;
}
 
class TPiCalculator
{
private:
  std::vector<unsigned int> iterations;
  std::vector<double> calculationResults;
public:
  TPiCalculator(unsigned int iterations[], const size_t length);
  std::vector<double> getResults();
  void Calculate();
  std::string ComposeResults();
};
 
TPiCalculator::TPiCalculator(unsigned int descriptor[], const size_t length)
{
  iterations.assign(descriptor, descriptor + length);
}
 
void TPiCalculator::Calculate()
{
  std::vector<std::shared_future<double>> executionResults;
  
  for (auto it : iterations)
      executionResults.push_back(std::async(CalculatePi, it));
      
  for (auto it : executionResults)
      calculationResults.push_back(it.get());
}
 
std::vector<double> TPiCalculator::getResults()
{
  return calculationResults;
}
 
std::string TPiCalculator::ComposeResults()
{
  std::ostringstream oss;
  
  oss << std::setprecision(12);
  
  for (size_t i = 0; i < calculationResults.size(); i++)
  {
    oss << "Thread " << std::setw(3) << i + 1 << " : iterations = " 
        << std::setw(10) << iterations[i] << ",\tPi = " << calculationResults[i]
        << std::endl;
  }
  
  return oss.str();
}
 
int main()
{
  unsigned int a[] = {10000000, 1000000, 100000, 10000, 1000, 100, 10, 1};
    
  TPiCalculator calculator(a, sizeof(a) / sizeof(*a));
  
  calculator.Calculate();
  
  std::cout << calculator.ComposeResults() << std::endl;
  
  return 0;
}

2) Старое-старое, причесанное и вроде адекватное.
Условие:
Цитата:
Разработать функцию, определяющую, является ли введенная строка полным палиндромом (т.е. элемент в середине должен быть в битовом представлении также палиндромом, если имеется).
Кликните здесь для просмотра всего текста
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
#include <string.h>
 
int IsPalyindrome(const char* s)
{
  int isPalyndrome = 1;
 
  const char* headIterator = NULL;
  const char* tailIterator = NULL;
 
  unsigned char blockSize = sizeof(long int);
  unsigned char middleByte = 0;
  unsigned char reversed = 0;
 
  size_t length = strlen(s);
  size_t N = (length / 2) / blockSize;
  size_t i = 0;
  size_t j = 0;
 
  headIterator = s;
  tailIterator = s + length - blockSize;
 
  i = 0;
  while ((i < N) && isPalyndrome)
  {
    j = 0;
    while ((j < blockSize) && isPalyndrome)
    {
      if (*(headIterator + j) != *(tailIterator + blockSize - 1 - j))
      {
        isPalyndrome = 0;
      }
      j++;
    }
 
    headIterator = headIterator + blockSize;
    tailIterator = tailIterator - blockSize;
    i++;
  }
 
  if (length % 2 == 1)
  {
    middleByte = (unsigned char)*(s + length / 2);
    reversed = ((middleByte * 0x0802LU & 0x22110LU) | (middleByte * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
 
    isPalyndrome = (reversed == middleByte);
  }
 
  return isPalyndrome;
}
 
int main(void)
{
  printf("%d\n", IsPalyindrome("qwertyuiop9876543210~0123456789poiuytrewq"));
 
  return 0;
}
Размещено в Без категории
Просмотров 477 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru