fork(5) download
  1. #include <iostream>
  2. #include <cmath>
  3. #include <limits>
  4. #include <string>
  5. using namespace std;
  6.  
  7. /*******************************************
  8.  *Задача про максимальную величину типа int*
  9.  *(Программа не сцепленная с разрядностью) *
  10.  *******************************************/
  11.  
  12. template <class T> T findmax()
  13. {
  14. T r1=1; // именно на этой переменной мы будем использовать побитовое смещение
  15. T k=1; // правильный ответ; Мы знаем что положительных чисел на 1 меньше чем отрицательных, так как одно значение знаимает нуль
  16. T r=1; // это то самое число которое будет испытывать на себе поянную ануляцию, что и позволит нам выявиль границы типа
  17. while( ( numeric_limits<T>::infinity() ? k*2 < numeric_limits<T>::infinity() : ((T)(k+1))>0 ) ) //елси это число имеет верхнюю границу, то удвенное k должно быть меньше чем этот предел(ибо k+1 будет давать нам вполне сносное значение(что для нас не приемлимо), поэтому я просто умножил на два чтобы наверняка), иначе: если при прибавлении единицы мы переходим границу возможных положительных чисел, то оно уж точно не будет больш нуля
  18. {
  19. r=k; // пустышку r мы снова приравниваем k
  20. r1=1; // подготавливаем все к новому возведению в степень
  21. for (;( numeric_limits<T>::infinity() ? (r<numeric_limits<T>::infinity()) : r >= k ) ;) //елси это число имеет верхнюю границу, то r должно быть меньше чем этот преде иначе: Выполняется пока число не переполнится и не станет меньше тени(k)
  22. {
  23. if( r>0 ) k=r;// первое присваивание мы пропускаем(не очень то и важно)
  24. r += r1; // постоянно прибавляем степени
  25. /*этот код дает такой эффект: вначале мы просто повышаем степень, а потом мы уже прибавляем к наивысшему числу которое нашла эта проверка степени */
  26. /*то есть после первого возведения в степень типа int мы получим: 2^30, а потом к 2^30 прибавляется поочередно +1, +2, +4; если и так постоянно будет начинать заново, и в конце к переменной будет прибавляться +1 и +3, тем самым заполняя оставшееся место до максимального числа в ислучае int это 2^31-1*/
  27. r1*=2;
  28.  
  29. }
  30. }
  31. return k;
  32. }
  33.  
  34.  
  35.  
  36. int main(void)
  37. {
  38. string c;
  39. cin >> c;
  40. if(c == "char")cout << "Char=" << (int)findmax<char>() << endl;
  41. else if(c == "unsigned char")cout << "uChar=" << (int)findmax<unsigned char>() << endl;
  42. else if(c == "short")cout << "Short="<< findmax<short>() << endl;
  43. else if(c == "unsigned short")cout << "uShort=" << findmax<unsigned short>() << endl;
  44. else if(c == "int")cout << "Int=" << findmax<int>() << endl;
  45. else if(c == "unsigned int")cout << "uInt=" << findmax<unsigned int>() << endl;
  46. else if(c == "long")cout << "Long=" << findmax<long>() << endl;
  47. else if(c == "unsigned long")cout << "uLong=" << findmax<unsigned long>() << endl;
  48. else if(c == "long long")cout << "Long long int=" << findmax<long long int>() << endl;
  49. else if(c == "unsigned long long")cout << "uLong long=" << findmax<unsigned long long int>() << endl;
  50. else if(c == "float")cout << "Float=" << (float)(findmax<float>()) << endl;
  51. else if(c == "double")cout << "Double=" << findmax<double>() << endl;
  52. else if(c == "long double")cout << "Long Double=" << findmax<long double>() << endl;
  53. else cout << "Нет такого типа" << endl;
  54.  
  55. return 0;
  56. }
  57.  
Success #stdin #stdout 0s 3484KB
stdin
double
stdout
Double=8.98847e+307