1 Отредактировано DiGriZ89 (2011-09-18 14:14:48)

Тема: Ошибки в описании SQRT - декомпозиции.

Вот рабочий вариант программы.
Смотреть комментарии

#include <vector>
#include <iostream>
#include <cmath>

using namespace std;

const int n = 10;

int main(){
  int a_init[n] = {2,4,3,1,6,7,8,9,1,7};
  vector<int> a (a_init, a_init+n);

  //предпосчёт
  int count = (int)sqrt(n + 0.0) + 1; //количество блоков
  int len = count - 1; //размер блока. // Количество блоков и их размер не равны, как сказано у вас.
  vector<int> b (count);
  for(int i = 0; i < n; ++i){
    b[i / len] += a[i];
    }

  for(;;){
    int l, r;
    cout<<"\nEnter l and r:";
    cin>>l;
    cin>>r;
    int sum = 0;
    for(int i=l; i<=r;){
      if(i % len == 0 && i + len - 1 <= r){
        sum += b[i / len];
        i += len; // Опечатка была здесь.
          }
      else{
           sum += a[i];
        ++i;
        }
      }
    }

  return 0;
  }

Спасибо за внимание.

2

Re: Ошибки в описании SQRT - декомпозиции.

Спасибо, "len" вместо "bl" я исправил (извечная проблема, когда копируешь рабочий код, а потом переименовываешь в нём переменные, и в итоге что-нибудь где-нибудь забываешь smile ).

Насчёт count и len не совсем согласен, т.к. можно их обе присвоить этому числу, так сказать, "с запасом". Последний блок может быть неполным или вовсе пустым (а при n=1 вообще будет и то, и то), однако это ничего не меняет - т.к. к лишним блокам вообще не будет обращений, а неполные блоки тоже ничего не портят.

А реализацию такое соглашение, что количество равно размеру, как-никак упрощает.

3

Re: Ошибки в описании SQRT - декомпозиции.

Спасибо.