понедельник, 14 марта 2011 г.

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

Цикл While. Блок 3. Анализ цифр числа.

Задача A. Сумма цифр числа
Дано натуральное число N. Напишите функцию int SumOfDigits (int n), вычисляющую сумму цифр числа N.

  1. int SumOfDigits (int n)
  2. {
  3.   int sum = 0;
  4.   while (n)
  5.   {
  6.     sum += n % 10;
  7.     n /= 10;
  8.   }
  9.   return sum;
  10. }
* This source code was highlighted with Source Code Highlighter.


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

  1. int NumberOfZeroes(int n)
  2. {
  3.   int count = 0;
  4.   while (n)
  5.   {
  6.     if (n % 10 == 0)
  7.       count++;
  8.     n /= 10;
  9.   }
  10.   return count;
  11. }
* This source code was highlighted with Source Code Highlighter.


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

  1. int MinDigit (int n)
  2. {
  3.   int cur;
  4.   int min_n = 9;
  5.   while (n)
  6.   {
  7.     cur = n % 10;
  8.     min_n = min(min_n,cur);
  9.     n /= 10;
  10.   }
  11.   return min_n;
  12. }
  13. int MaxDigit (int n)
  14. {
  15.   int cur;
  16.   int max_n = 0;
  17.   while (n)
  18.   {
  19.     cur = n % 10;
  20.     max_n = max(max_n,cur);
  21.     n /= 10;
  22.   }
  23.   return max_n;
  24. }
* This source code was highlighted with Source Code Highlighter.


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

  1.   int n;
  2.   cin >> n;
  3.  
  4.   while (n)
  5.   {
  6.     cout << n % 2;
  7.     n >>= 1;
  8.   }
  9.   cout << n;
* This source code was highlighted with Source Code Highlighter.


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

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

  1. int reverse(int n)
  2. {
  3.   do
  4.   {
  5.     cout << n % 10;
  6.     n /= 10;
  7.   }
  8.   while (n);
  9.   return 0;
  10. }
* This source code was highlighted with Source Code Highlighter.

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

  1. int reverse(int n)
  2. {
  3.   int rev = 0;
  4.   do
  5.   {
  6.     rev = rev * 10 + n % 10;
  7.     n /= 10;
  8.   }
  9.   while (n);
  10.   return rev;
  11. }
* This source code was highlighted with Source Code Highlighter.


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

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

1 комментарий: