воскресенье, 13 февраля 2011 г.

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

Цикл For. Блок 1. Вычисление сумм и произведений.

Задача A. Сумма квадратов
По данному натуральному n вычислите сумму 12+22+...+n2.

  1.   int n, s = 0;
  2.   cin >> n;
  3.   for(int i = 1 ; i <= n ; i++)
  4.     s += i*i;
  5.  
  6.   cout << s;
* This source code was highlighted with Source Code Highlighter.


Задача C. Факториал
Вычислите N! ("эн-факториал") – произведение всех натуральных чисел от 1 до N ( N!=1∙2∙3∙…∙ N ).
N – натуральное, не превосходит 12.

  1.   int n, nf = 1;
  2.   cin >> n;
  3.   for(int i = 2 ; i <= n ; i++)
  4.     nf *= i;
  5.   cout << nf;
* This source code was highlighted with Source Code Highlighter.


Задача D. Степень
Выведите число 2 N. N не превосходит 30.

  1.   const int count = 2;
  2.   int n, rez = 1;
  3.   cin >> n;
  4.   for(int i = 1 ; i <= n ; i++)
  5.     rez *= count;
  6.   cout << rez;

* This source code was highlighted with Source Code Highlighter.

Этот вариант использует циклы и более прозрачен. При чем заведенная константа позволяет вычислять степени любого основания, следует лишь дать другое значение константе count.

Однако, если речь идет конкретно об основании 2, добиться того же эффекта можно проще, не прибегая к циклам, методом побитового сдвига.

  1. int n;
  2.   cin>>n;
  3.   cout<<(1<<n);
* This source code was highlighted with Source Code Highlighter.


Задача E. Число сочетаний
По данным натуральным n и k вычислите значение Cnk = n! / (k!(n-k)!) (число сочетаний из n элементов по k).

  1.   long long n,k;
  2.   cin>>n>>k;
  3.   long long res = 1;
  4.  
  5.   for (int i=1;i<=k;i++)
  6.   {
  7.     res *= (n-k+i);
  8.     res /= i;
  9.   }
  10.   cout<<res; 
* This source code was highlighted with Source Code Highlighter.


Задача G. Геометрическая прогрессия
По данному действительному числу a и натуральному n вычислите сумму 1+a+a2+...+an, не используя формулу суммы геометрической прогрессии. Время работы программы должно быть пропорционально n.

  1.   double a;
  2.   int n;
  3.   cin >> a >> n;
  4.   double sum = 1 , an = 1;
  5.  
  6.   for( int i = 1 ; i <= n ; i++)
  7.   {
  8.     an *= a;
  9.     sum += an;
  10.   }
  11.   printf("%0.8f",sum);
* This source code was highlighted with Source Code Highlighter.


Задача H. Сумма – 1
По данному числу n вычислите сумму 1+1/22+1/32+...+1/n2. Вводится одно число n, не превосходящее 100000.

  1.   int n;
  2.   cin >> n;
  3.   double sum = 0;
  4.  
  5.   for( long long i = 1 ; i <= n ; i++)
  6.     sum += 1.0/(i*i);
  7.  
  8.   printf("%0.8f",sum);
* This source code was highlighted with Source Code Highlighter.


Задача I. Сумма – 2
По данному числу n вычислите сумму 4(1-1/3+1/5-1/7+...+(-1)n/(2n+1)).  Вводится одно число n, не превосходящее 100000.

  1.   int n;
  2.   cin >> n;
  3.   double sum = 1.0;
  4.  
  5.   int sign = -1;
  6.   for(int i = 1 ; i <= n ; i++) {
  7.     sum += sign / ( 2.0 * i + 1 );
  8.     sign = -sign;
  9.   }
  10.  
  11.   printf("%0.8f", 4 * sum);
* This source code was highlighted with Source Code Highlighter.


Задача J. Сумма степеней
Вычислите 1+2+22+23+…+2N. N – натуральное, не превосходит 30.

  1.   const int osn = 2;
  2.   int n;
  3.   cin >> n;
  4.   int step = 1, sum = 1;
  5.  
  6.   for( int i = 1 ; i <= n ; i++)
  7.   {
  8.     step *= osn;
  9.     sum += step;
  10.   }
  11.   cout << sum;
* This source code was highlighted with Source Code Highlighter.

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

  1.   int n;
  2.   cin >> n;
  3.   int step = 1, sum = 1;
  4.  
  5.   for( int i = 1 ; i <= n ; i++)
  6.   {
  7.     step <<= 1;
  8.     sum += step;
  9.   }
  10.   cout << sum;
* This source code was highlighted with Source Code Highlighter.


Задача K. 1/0!+1/1!+1/2!+...
По данному натуральному числу N найдите сумму чисел 1+1/1!+1/2!+1/3!+...+1/N!. Количество действий должно быть пропорционально N.

  1.   int n;
  2.   cin >> n;
  3.   int step = 1, sum = 1;
  4.  
  5.   for( int i = 1 ; i <= n ; i++)
  6.   {
  7.     step <<= 1;
  8.     sum += step;
  9.   }
  10.   cout << sum;
* This source code was highlighted with Source Code Highlighter.

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

  1. Я очень доволен услугами мистера Ли по ссуде, и ваши предложения помогли мне получить очень хорошую сделку по жилищному кредиту. Я был бы рад порекомендовать ваши услуги своим друзьям, ищущим ссуду ».
    Не ходите никуда, если ищете ссуду. Мистер Ли лучший. Я очень рекомендую его услуги. Лучшее, что я когда-либо имел удовольствие работать с его ссудой с низкой процентной ставкой. «Это г-н Ли. Контакт на случай, если кто-то здесь ищет ссуду. Whatsapp: + 1-989-394-3740. & Электронная почта: 247officedept@gmail.com

    ОтветитьУдалить