Форум программистов, компьютерный форум CyberForum.ru

не работает sqrt декомпозиция - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Mines
0 / 0 / 0
Регистрация: 25.08.2012
Сообщений: 8
25.08.2012, 13:38     не работает sqrt декомпозиция #1
Добрый день, пытался разобраться с sqrt-декомпозицией. Суть понял, но вот код не хочет работать. точнее он не хочет работать правильно.
вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstdio>
 
 
using namespace std;
 
int main() {
    int n ;
    cin>>n;
    int mas_1[n];
    for (int i = 0; i<n; i++)
        cin>>mas_1[i];
        
    int len = (int)sqrt(n) + 1;
    int mas_2[n];
    for (int i = 0; i < n; i++)
        {
        mas_2[i / len] += mas_1[i];
        cout<<mas_2[i]<<' ';
        }
}
input:
8
3 4 8 7 1 6 1 6
(все через пробел)
output:3 25350624 -1080283792 6 7 134515024 -1080283848 8

А должно же быть нормальные промежутки, то есть во втором массиве первый элемент должен быть равен 15. второй 14 и так далее.
Вопрос - почему так выводит и что я сделал неправильно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 13:48     не работает sqrt декомпозиция #2
Не инициализировали mas_2. В результате там чёрти что хранится. В Си++ значение неинициализированных локальных переменных не определено. Это не нули или что-то ещё. Надо прописывать руками, что там должны быть нули. Например, так:
int mas_2[n] = { 0 };
Хотя, по идее, это не работает для variable-sized массивов, так что придётся писать цикл for, который всем выставит нули.
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
25.08.2012, 13:48     не работает sqrt декомпозиция #3
Разве эта программа компилируется?! Размер массива должен быть константой
Цитата Сообщение от Mines Посмотреть сообщение
int n ;
cin>>n;
int mas_1[n];
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
25.08.2012, 13:52     не работает sqrt декомпозиция #4
Intel~lect, оно будет компилиться в некоторых компиляторах, хоть это не по стандарту.

Добавлено через 23 секунды

Не по теме:

я сам раньше так делал

OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 13:52     не работает sqrt декомпозиция #5
Эта фишка поддерживается некоторыми компиляторами, тем же g++. Но в стандарт C++ не входит (зато есть в C99, хотя и там она помечена как опциональная).
4iFF
25.08.2012, 14:41
  #6

Не по теме:


Цитата Сообщение от Mines Посмотреть сообщение
он не хочет работать правильно.
Программа всегда, если работает, то работает правильно.Это программист может не правильно думать.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2012, 02:03     не работает sqrt декомпозиция
Еще ссылки по теме:

Почему не работает sqrt? Подскажите, где ошибка? Простенькая программа с тремя функциями C++
Дано натуральное число n. Вычислить sqrt(2+ sqrt(5 + sqrt(7...)) C++
C++ Вычислить y=sqrt(1+sqrt(4+sqrt(9+.+sqrt(36+sqrt(49)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Mines
0 / 0 / 0
Регистрация: 25.08.2012
Сообщений: 8
26.08.2012, 02:03  [ТС]     не работает sqrt декомпозиция #7
Вот учел поправку ~OhMyGodSoLong~
Вот стало так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstdio>
 
 
using namespace std;
 
int main() {
    int n ;
    cin>>n;
    int mas_1[n];
    for (int i = 0; i<n; i++)
        cin>>mas_1[i];
 
    int len = (int)sqrt(n) + 1;
    int mas_2[n];
    for (int i =0; i<n; i++)
        mas_2[i] = 0;
 
    for (int i = 0; i < n; i++)
        {
        mas_2[i / len] = mas_1[i] + mas_2[i/len];
        cout<<mas_2[i]<<' ';
        }
}
Но теперь в output при том же самом примере выдает mas_2[0] = 3 а остальные элементы массива заполнены нулями, то есть их значение не изменились. В чем причина?
Если кто-то знает, как правильно напистаь sqrt-декомпозицию - прошу помочь и\или поделится кодом. Спасибо!

Добавлено через 9 часов 41 минуту
Думал, это причина в том, что объявляю массив не верно. Решил попробовать статически объявить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstdio>
 
 
using namespace std;
 
int main() {
    /*
    int n ;
    cin>>n;
    */
    int mas_1[8] = {3,4,8,7,1,6,1,6};
    /*
    for (int i = 0; i<n; i++)
        cin>>mas_1[i];
    */
    int len = (int)sqrt(8) + 1;
    int mas_2[8];
    for (int i =0; i<8; i++)
        mas_2[i] = 0;
 
    for (int i = 0; i < 8; i++)
        {
        mas_2[i / len] = mas_1[i] + mas_2[i/len];
        cout<<mas_2[i]<<' ';
        }
}
В результате выдает то же, что и во второй раз - первый элемент = 3, а остальные = 0
В чем причина???
Yandex
Объявления
26.08.2012, 02:03     не работает sqrt декомпозиция
Ответ Создать тему
Опции темы

Текущее время: 15:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru