Последовательность состоит из натуральных чисел и завершается числом 0 определите сколько элементов
Перейти к содержимому

Последовательность состоит из натуральных чисел и завершается числом 0 определите сколько элементов

Python-сообщество

Доброго времени суток
В качестве практики решаю задачки на питонтьютор, и попалась следующая:
Последовательность состоит из натуральных чисел и завершается числом 0. Определите, сколько элементов этой последовательности равны ее наибольшему элементу.

Для решения данной задачи написал код, он работает, но что-то мне подсказывает, что сделал все не через то место, и он должен быть существенно короче, если подскажете, в чем я ошибся, то буду премного благодарен.

Отредактировано Sanya9652 (Ноя. 5, 2020 08:42:59)

#2 Ноя. 5, 2020 12:25:53

Задача «Количество элементов, равных максимуму»

Отредактировано py.user.next (Ноя. 5, 2020 12:26:10)

#3 Ноя. 5, 2020 17:43:35

Задача «Количество элементов, равных максимуму»

А слабо, собрать входные данные в список, отсортировать его реверсивно и, в цикле, посчитать сколько элементов равны певому элементу списка?

#4 Ноя. 5, 2020 23:33:41

Задача «Количество элементов, равных максимуму»

Сделай, конечно, так, чтобы чисто лучше питон узнать. Но это алгоритмически неправильно. Во-первых, данные нужно стараться обрабатывать так, будто они поступают бесконечно (это могут быть датчики, огромные массивы данных и тому подобное), поэтому нужно стараться не собирать данные никуда, а обрабатывать их на лету, иначе не хватит памяти и время выполнения будет удлинняться. Во-вторых, ты предложил отсортировать все данные, хотя в них может быть, например, миллиард единиц и двоек и одно число сто. Зачем сортировать этот миллиард элементов? Достаточно число сто получить через линейную функцию max(), а потом считать его количество такой же линейной функцией. При этом миллиард единиц и двоек остаются нетронутыми на своих местах и, соответственно, на них не тратится время на сравнения и перемещения.

У него же алгоритм верный — обработка идёт на лету, — но он его не смог точно реализовать и написал код с ошибкой. Единственное что, он не должен читать из входного потока, а должен брать элементы из итератора, а итератор уже прикрепляется к входному потоку ввода. Так итератор можно прикреплять не только к входному потоку ввода, но и к сетевому сокету, к файлу, к любому генератору данных.

Школе NET

Submit to our newsletter to receive exclusive stories delivered to you inbox!

Мари Умняшка

Помогите решить задачу на языке Python 3.0. Последовательность состоит из натуральных чисел и завершается числом 0. Определите, сколько элементов этой последовательности больше предыдущего элемента. (решение должно быть с циклом while)

Лучший ответ:

Зачетный Опарыш

Последовательность состоит
из натуральных чисел и завершается
числом 0. Определите, сколько
элементов этой последовательности
больше предыдущего элемента.

prev = int(input()) # ввод первого элемента
count = 0 # изначально 0 элементов

while True:
n = int(input()) # ввод числа
if n == 0:
break # выход, если 0
if n > prev:
count += 1
prev = n # смещение числа

Решение задач на С++

Задача B. Количество нулей
Дано натуральное число N. Напишите функцию int NumberOfZeroes(int n), определяющую количество нулей среди всех цифр числа N.

  1. int NumberOfZeroes( int n)
  2.   int count = 0;
  3.   while (n)
  4.  
  5.     if (n % 10 == 0)
  6.       count++;
  7.     n /= 10;
  8.   >
  9.   return count;
  10. >

Задача C. Минимальная и максимальная цифры
Дано натуральное число N. Напишите функцию int MinDigit (int n)  и int MaxDigit (int n), определяющие наименьшую и наибольшую цифры данного числа.
Необходимо вывести наименьшую и наибольшую цифры данного числа через пробел.

  1. int MinDigit ( int n)
  2.   int cur;
  3.   int min_n = 9;
  4.   while (n)
  5.  
  6.     cur = n % 10;
  7.     min_n = min(min_n,cur);
  8.     n /= 10;
  9.   >
  10.   return min_n;
  11. >
  12. int MaxDigit ( int n)
  13.   int cur;
  14.   int max_n = 0;
  15.   while (n)
  16.  
  17.     cur = n % 10;
  18.     max_n = max(max_n,cur);
  19.     n /= 10;
  20.   >
  21.   return max_n;
  22. >

Задача D. Двоичная запись
Дано натуральное число N. Выведите его представление в двоичном виде в обратном порядке.

  1.   int n;
  2.   cin >> n;
  3.  
  4.   while (n)
  5.  
  6.     cout << n % 2;
  7.     n >>= 1;
  8.   >
  9.   cout << n;

Задача E. Обращение числа
Напишите функцию int reverse(int n), которая переставляет цифры числа в обратном порядке .

Вариант 1. Если перевернутое число не требуется оформлять как отдельную переменную, то можно, просто откусывая последние цифры исходного числа, выписывать их в строку вывода .

  1. int reverse( int n)
  2.   do
  3.  
  4.     cout << n % 10;
  5.     n /= 10;
  6.   >
  7.   while (n);
  8.   return 0;
  9. >

Вариант 2. Но можно и завести отдельную переменную под перевертыш, тогда появится возможность при необходимости использовать результат в дальнейшем.

  1. int reverse( int n)
  2.   int rev = 0;
  3.   do
  4.  
  5.     rev = rev * 10 + n % 10;
  6.     n /= 10;
  7.   >
  8.   while (n);
  9.   return rev;
  10. >

Задача F. Количество палиндромов
Назовем число палиндромом, если оно не меняется при перестановке его цифр в обратном порядке. Напишите функцию bool IsPalindrome (int n), проверяющую по данному числу n, является ли оно палиндромом.
Напишите программу, которая по заданному числу K выводит количество натуральных палиндромов, не превосходящих K.

  1. bool IsPalindrome ( int cur)
  2.   int base = cur;
  3.   int rev = 0;
  4.   while (cur)
  5.  
  6.     rev = rev * 10 + cur % 10;
  7.     cur /= 10;
  8.   >
  9.   if ( base == rev)
  10.     return true ;
  11.   else
  12.     return false ;
  13. >
  14. int main()
  15.   freopen( "input.txt" , "r" ,stdin);
  16.   freopen( "output.txt" , "w" ,stdout);
  17.  
  18.   int n;
  19.   cin >> n;
  20.   int cur = 1, count = 0;
  21.  
  22.   while (cur <= n)
  23.  
  24.     if (IsPalindrome (cur))
  25.       count++;
  26.     cur++;
  27.   >
  28.   cout << count;

Операторы цикла

Цикл While. Блок 2. Обработка последовательностей, индуктивные функции.

Задача A. Длина последовательности
Программа получает на вход последовательность целых неотрицательных чисел, каждое число записано в отдельной строке. Последовательность завершается числом 0, при считывании которого программа должна закончить свою работу и вывести количество членов последовательности (не считая завершающего числа 0).
Числа, следующие за числом 0, считывать не нужно.

  1.   int x, length = -1;
  2.   do
  3.  
  4.     length++;
  5.     cin>>x;
  6.   >
  7.   while (x);
  8.   cout << length;

Задача B. Сумма последовательности
Определите сумму всех элементов последовательности, завершающейся числом 0.
Числа, следующие за нулем, считывать не нужно.

  1.   int x, sum = 0;
  2.   cin >> x;
  3.   while (x)
  4.  
  5.     sum += x;
  6.     cin >> x;
  7.   >
  8.   cout << sum;

Задача C. Среднее значение последовательности
Определите среднее значение всех элементов последовательности, завершающейся числом 0.
Числа, следующие за нулем, считывать не нужно.

  1.   int x, sum = 0, length = 0;
  2.   while (cin>>x && x)
  3.  
  4.     sum += x;
  5.     length++;
  6.   >
  7.   double rms = ( double )sum / length;
  8.   printf( "%0.15f" ,rms);

Задача D. Количество четных элементов последовательности
Определите количество четных элементов в последовательности, завершающейся числом 0.
Само число 0, и все, что следует за ним, учитывать не нужно.

  1.   int x, count = 0;
  2.   cin >> x;
  3.   while (x)
  4.  
  5.     if (!(x & 1))
  6.       count++;
  7.     cin >> x;
  8.   >
  9.   cout << count;

Задача E. Максимум последовательности
Последовательность состоит из натуральных чисел и завершается числом 0. Определите значение наибольшего элемента последовательности.
Числа, следующие за нулем, считывать не нужно.

  1.   int x;
  2.   cin >> x;
  3.   int Max = x;
  4.   while (x)
  5.  
  6.     Max = max(Max,x);
  7.     cin >> x;    
  8.   >
  9.   cout << Max;

Задача F. Количество элементов, которые больше предыдущего
Последовательность состоит из натуральных чисел и завершается числом 0. Определите, сколько элементов этой последовательности больше предыдущего элемента.
Числа, следующие за числом 0, считывать не нужно.

  1.   int prv, cur;
  2.   cin >> cur;
  3.   int count = 0;
  4.   while (cur)
  5.  
  6.     prv = cur;
  7.     cin >> cur; 
  8.     if (cur > prv)
  9.       count++;
  10.   >
  11.   cout << count;

Задача G. Второй максимум
Последовательность состоит из различных натуральных чисел и завершается числом 0. Определите значение второго по величине элемента в этой последовательности.
Числа, следующие за числом 0, считывать не нужно.

  1.   int x;
  2.   cin >> x;
  3.   int max1 = x, max2 = -1;
  4.   while (x)
  5.  
  6.     cin >> x;
  7.     if (x > max1)
  8.    
  9.       max2 = max1;
  10.       max1 = x;
  11.     >
  12.     else if ( x > max2 )
  13.       max2 = x;
  14.   >
  15.   cout << max2;

Задача H. Второй максимум – 2
Последовательность состоит из натуральных чисел и завершается числом 0. Определите значение второго по величине элемента в этой последовательности, то есть элемента, который будет наибольшим, если из последовательности удалить наибольший элемент.
Числа, следующие за числом 0, считывать не нужно.

  1.   int x;
  2.   cin >> x;
  3.   int max1 = x, max2 = -1;
  4.   while (x)
  5.  
  6.     cin >> x;
  7.     if (x > max1)
  8.    
  9.       max2 = max1;
  10.       max1 = x;
  11.     >
  12.     else if ( x > max2 )
  13.       max2 = x;
  14.   >
  15.   cout << max2;

Задача I. Количество элементов, равных максимуму
Последовательность состоит из натуральных чисел и завершается числом 0. Определите, какое количество элементов этой последовательности, равны ее наибольшему элементу.
Числа, следующие за числом 0, считывать не нужно.

  1.   int x, count = 0;
  2.   cin >> x;
  3.   int max = x;
  4.   while (x)
  5.  
  6.     if (x > max)
  7.    
  8.       max = x;
  9.       count = 1;
  10.     >
  11.     else
  12.       if (x == max)
  13.         count++;
  14.     cin >> x;    
  15.   >
  16.   cout << count;

Задача J. Сумма последовательности – 2
Найдите сумму последовательности натуральных чисел, если признаком окончания конца последовательности является два подряд идущих числа 0.
Числа, следующие после двух подряд идущих нулей считывать не нужно.

  1.   int x;
  2.   cin >> x;
  3.   int sum = 0;
  4.   if (x == 0)
  5.     cin >> x;
  6.   while (x)
  7.  
  8.     sum += x;
  9.     cin >> x;
  10.     if (x == 0)
  11.       cin >> x;
  12.   >
  13.   cout << sum;

Задача K. Максимальное число идущих подряд равных элементов
Дана последовательность натуральных чисел, завершающаяся числом 0. Определите, какое наибольшее число подряд идущих элементов этой последовательности равны друг другу.
Числа, следующие за числом 0, считывать не нужно.

  1.   int cur;
  2.   cin >> cur;
  3.   int base = cur, count = 0, count_max = 0;
  4.   while (cur)
  5.  
  6.     if ( base == cur)
  7.       count++;
  8.     else
  9.    
  10.       base = cur;
  11.       count = 1;
  12.     >
  13.     count_max = max(count_max, count);
  14.     cin >> cur;
  15.   >
  16.   cout << count_max;

Задача L. Максимальная длина монотонного фрагмента
Дана последовательность натуральных чисел, завершающаяся число 0. Определите наибольшую длину монотонного фрагмента последовательности (то есть такого фрагмента, где все элементы либо больше предыдущего, либо меньше).
Числа, следующие за числом 0, считывать не нужно.

  1.   int prv, cur;
  2.   cin >> prv;
  3.   if (prv)
  4.  
  5.     cin >> cur;
  6.     int count = 1, count_max = 1;
  7.     int sgn_prv = cur — prv, sgn_cur;
  8.  
  9.     while (cur)
  10.    
  11.       sgn_cur = cur — prv;
  12.       if (sgn_prv * sgn_cur > 0)
  13.         count++;
  14.       else
  15.         if (sgn_prv * sgn_cur == 0)
  16.           count = 1;
  17.         else
  18.           count = 2;
  19.       count_max = max(count_max, count);
  20.       sgn_prv = sgn_cur;
  21.       prv = cur;
  22.       cin >> cur;
  23.     >
  24.     cout << count_max;
  25.   >
  26.   else
  27.     cout << 0;

Задача M. Количество локальных максимумов
Элемент последовательности называется локальным максимумом, если он строго больше предыдущего и последующего элемента последовательности. Первый и последний элемент последовательности не являются локальными максимумами.
Дана последовательность натуральных чисел, завершающаяся числом 0. Определите количество строгих локальных максимумов в этой последовательности.
Числа, следующие за числом 0, считывать не нужно.

  1.   int prv, cur, nxt;
  2.   int count = 0;
  3.   if (cin>>prv && prv)
  4.  
  5.     if (cin >> cur && cur)
  6.    
  7.       if (cin >> nxt)
  8.      
  9.         while (nxt)
  10.        
  11.           if ((prv < cur) && (cur > nxt))
  12.             count++;
  13.           prv = cur;
  14.           cur = nxt;
  15.           cin >> nxt;
  16.         >
  17.       >
  18.     >
  19.   >
  20.   cout << count;

Задача N. Наименьшее расстояние между локальными максимумами
Определите наименьшее расстояние между двумя локальными максимумами последовательности натуральных чисел, завершающейся числом 0. Если в последовательности нет двух локальных максимумов, выведите число 0.

  1.   int prv, cur, nxt, pos = 0, prv_max = 0, min_len = 0, cur_len;
  2.   int count = 0;
  3.   if (cin>>prv && prv)
  4.  
  5.     if (cin >> cur && cur)
  6.    
  7.       if (cin >> nxt)
  8.      
  9.         pos = 2;
  10.         while (nxt)
  11.        
  12.           if ((prv < cur) && (cur > nxt))
  13.          
  14.             if (prv_max != 0 )
  15.            
  16.               cur_len = pos — prv_max;
  17.               if (min_len == 0)
  18.                 min_len = cur_len;
  19.               else
  20.                 min_len = min(min_len,cur_len);
  21.             >
  22.             prv_max = pos;
  23.           >
  24.           prv = cur;
  25.           cur = nxt;
  26.           cin >> nxt;
  27.           pos++;
  28.  
  29.         >
  30.       >
  31.     >
  32.   >
  33.   cout<<min_len;

Дана последовательность натуральных чисел x1, x2, . xn. Стандартным отклонением называется величина
1
где2 —среднее арифметическое последовательности.

Определите среднеквадратичное отклонение для данной последовательности натуральных чисел, завершающейся числом 0.

  1.   int x;
  2.   cin >> x;
  3.   int   sum_x = 0, sum_x2 = 0, n = 0;
  4.   double s, res;
  5.   if (x)
  6.  
  7.     while (x)
  8.    
  9.       sum_x += x;
  10.       sum_x2 += x*x;
  11.       n++;
  12.       cin >> x;
  13.     >
  14.     s = ( double )sum_x / n;
  15.     if (n != 1)
  16.    
  17.       res = sqrt((sum_x2 — 2 * s * sum_x + n * s * s) / (n — 1));
  18.       printf( "%0.11f" , res);
  19.     >
  20.     else
  21.       cout << 0;
  22.   >

Операторы цикла

Цикл While. Блок 1. Задачи на цикл While.

Задача A. Список квадратов
Выведите все точные квадраты натуральных чисел, не превосходящие данного числа N.

  1.   int n;
  2.   cin>>n;
  3.   int value = 1;
  4.   int curSqr = value * value ;
  5.   while (curSqr<=n)
  6.  
  7.     cout<<curSqr<< ‘ ‘ ;
  8.     value ++;
  9.     curSqr = value * value ;
  10.   >

Задача B. Минимальный делитель
Дано целое число, не меньшее 2. Выведите его наименьший натуральный делитель, отличный от 1.

  1.   int n;
  2.   cin >> n;
  3.   int i = 2, min_den = 1;
  4.   int sqrt_n = sqrt(( double )n);
  5.   while (i <= sqrt_n)
  6.  
  7.     if (n % i == 0)
  8.    
  9.       min_den = i;
  10.       break ;
  11.     >
  12.     i++;
  13.   >
  14.   if (min_den == 1)
  15.     cout << n;
  16.   else
  17.     cout << min_den;

Задача C. Список степеней двойки
По данному числу N распечатайте все целые степени двойки, не превосходящие N, в порядке возрастания. Операцией возведения в степень пользоваться нельзя!

  1.   int n;
  2.   cin >> n;
  3.  
  4.   int pow2 = 1;
  5.   while (pow2 <= n)
  6.  
  7.     cout << pow2 << ‘ ‘ ;
  8.     pow2 *=2;
  9.   >

Той же  самой цели можно добиться, заменив явное умножение на 2 побитовым сдвигом.
Вариант 2.

  1.   int n;
  2.   cin >> n;
  3.  
  4.   int pow2 = 1;
  5.   while (pow2 <= n)
  6.  
  7.     cout << pow2 << ‘ ‘ ;
  8.     pow2 <<= 1;
  9.   >

Задача D. Точная степень двойки
Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае. Операцией возведения в степень пользоваться нельзя!

  1.   int n;
  2.   cin>>n;
  3.   int bitAmount = 0;
  4.   while (n)
  5.     bitAmount += n % 2;
  6.     n /= 2;
  7.   >
  8.   if (bitAmount == 1)
  9.     cout<< "YES" ;
  10.   else
  11.     cout<< "NO" ;

Задача E. Двоичный логарифм
По данному натуральному числу N выведите такое наименьшее целое число k, что 2 k ≥N.
Операцией возведения в степень пользоваться нельзя!

  1.   int n;
  2.   cin >> n;
  3.  
  4.   int pow2 = 1, k = 0;
  5.   while (pow2 < n)
  6.  
  7.     pow2 <<=1;
  8.     k++;
  9.   >
  10.   cout << k;

Задача F. Утренняя пробежка
В первый день спортсмен пробежал x километров, а затем он каждый день увеличивал пробег на 10% от предыдущего значения. По данному числу y определите номер дня, на который пробег спортсмена составит не менее y километров.
Программа получает на вход действительные числа x и y и должна вывести одно натуральное число.

  1.   double x, y;
  2.   cin >> x >> y;
  3.   int k = 1;
  4.  
  5.   while (x < y)
  6.  
  7.     x *= 1.1;
  8.     k++;
  9.   >
  10.   cout << k;

Задача G. Банковские проценты
Вклад в банке составляет x рублей. Ежегодно он увеличивается на p процентов, после чего дробная часть копеек отбрасывается. Каждый год сумма вклада становится больше. Определите, через сколько лет вклад составит не менее y рублей.
Программа получает на вход три натуральных числа: x, p, y и должна вывести одно целое число.

  1.   double x,p,y;
  2.   int years = 0;
  3.   cin>>x>>p>>y;
  4.   while (x<y)
  5.     x *= (1 + p/100.0);
  6.     x *= 100;
  7.     x = ( int ) x;
  8.     x /= 100;
  9.     years++;
  10.   >
  11.   cout<<years;
  1.   int n, i = 2, f1 = 0, f2 = 1, cur;
  2.   cin >> n;
  3.  
  4.   while (i <= n)
  5.  
  6.     cur = f1 + f2;
  7.     f1 = f2;
  8.     f2 = cur;
  9.     i++;
  10.   >
  11.   if (n<=1)
  12.     cout<<n;
  13.   else
  14.     cout << cur;

Задача I. Номер числа Фибоначчи
Дано натуральное число A. Определите, каким по счету числом Фибоначчи оно является, то есть выведите такое число n, что φn=A. Если А не является числом Фибоначчи, выведите число -1.

  1.   int a, i = 1, f1 = 0, f2 = 1, cur = 1;
  2.   cin >> a;
  3.  
  4.   while (cur < a)
  5.  
  6.     cur = f1 + f2;
  7.     f1 = f2;
  8.     f2 = cur;
  9.     i++;
  10.   >
  11.   if (cur == a)
  12.     cout << i;
  13.   else
  14.     cout << -1;

Задача J. Исполнитель Раздвоитель
Исполнитель “Раздвоитель” преобразует натуральные числа. У него есть две команды: “Вычесть 1” и “Разделить на 2”, первая команда уменьшает число на 1, вторая команда уменьшает число в два раза, если оно чётное, иначе происходит ошибка.
Дано два натуральных числа A и B (A>B). Напишите алгоритм для Раздвоителя, который преобразует число A в число B и при этом содержит минимальное число команд. Команды алгоритма нужно выводить по одной в строке, первая команда обозначается, как -1, вторая команда как :2.

  1.   int a, b;
  2.   cin >> a >> b;
  3.  
  4.   while (a > b)
  5.  
  6.     if (a % 2 == 0 && a / 2 >= b)
  7.    
  8.       cout << ":2" << endl;
  9.         a /= 2;
  10.     >
  11.     else
  12.    
  13.       cout << -1 << endl;
  14.       a—;
  15.     >
  16.   >

Задача K. Исполнитель Водолей
У исполнителя “Водолей” есть два сосуда, первый объемом A литров, второй объемом B литров, а также кран с водой. Водолей может выполнять следующие операции:
Наполнить сосуд A (обозначается >A).
Наполнить сосуд B (обозначается >B).
Вылить воду из сосуда A (обозначается A>).
Вылить воду из сосуда B (обозначается B>).
Перелить воду из сосуда A в сосуд B (обозначается как A>B).
Перелить воду из сосуда B в сосуд A (обозначается как B>A).
Команда переливания из одного сосуда в другой приводят к тому, что либо первый сосуд полностью опустошается, либо второй сосуд полностью наполняется.
Программа получает на вход три натуральных числа A, B, N, не превосходящих 10 4 Вам необходимо вывести алгоритм действий Водолея, который позволяет получить в точности N литров в одном из сосудов, если же такого алгоритма не существует, то программа должна вывести текст Impossible. Количество операций в алгоритме не должно превышать 10 5 . Гарантируется, что если задача имеет решение, то есть решение, которое содержит не более, чем 10 5 операций.

Добавить комментарий

Ваш адрес email не будет опубликован.