Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
BitFields
49 / 47 / 3
Регистрация: 03.08.2009
Сообщений: 101
#1

Оптимизация - C++

28.08.2009, 12:08. Просмотров 1085. Ответов 12
Метки нет (Все метки)

Как-нибудь можно уменьшить размер кода, т.е. сократить количество строк данного кода:
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
30
31
32
33
34
35
#include <cmath>
#include "windows.h"
 
using namespace std;
 
int main()
{
    const int n=1000;
             long tmp=1;
    double sum=1, temp;
    for(int i=0; i<n; i++)
    {
        if(i>0)
        {
        tmp=i+1;
        }
        temp=1/(pow((double)tmp, (double)tmp));
        if((i==0) || (i%2)==1)
        {
            if(i>0)
            {
            sum=sum-temp;
            }
        }
        else
        {
            sum=sum+temp;
        }
        if(temp<0.00003f)
        {
            break;
        };
    }//for(int i=0; i<n; i++)
    cout<<"Summ row of type (-1)^(n-1)*1/n^n: ") equal to <<sum<<endl;
}
Вычисляет ряд вида (-1)^(n-1)*1/n^n=1-1/(2^2)+1/(3^3)-...=S
Выход, когда (n-1)*1/n^n<0.00003.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2009, 12:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оптимизация (C++):

Оптимизация алгоритма Хаффмана - C++
Сделал архиватор, но работает он запредельно долго ~ 30 мин на папку размером 50Mb(и это только упаковка). нужна помощь &quot;Гуру&quot; что бы...

Оптимизация функции Math.pow - C++
Добрый день уважаемые знатоки. Хотел спросить, можна ли как то оптимизировать функцию math.pow. Заранее спасибо

Игра, подобная шашкам. Оптимизация кода - C++
Добрый вечер. У меня маленькая проблема: пишу игру, наподобие шашек. Почти готово, потом выложу исходники для критики. Сейчас делаю...

В дизассемблерованном коде отсутствует позднее связывание. Оптимизация? - C++
Добрый день/утро/вечер (нужное подчеркнуть)) Выдалось свободное время и решил немного пописать марсианского кода) В процессе написания...

Оптимизация в пределах линейных участков - исключение лишних переменных - C++
Необходимо произвести оптимизацию в пределах линейных участков (исключить лишние переменные). На входе имеем синтаксическое дерево. (На...

оптимизация - C++ Builder
Здравствуйте. Хотел оптимизировать следующий код разбив функцию блок на две функции(время компиляции примерно на 25 процентов...

12
mustardandrew
Человек
96 / 80 / 3
Регистрация: 16.06.2009
Сообщений: 229
28.08.2009, 12:34 #2
Сократить количество строк можна так (но к оптимизации ето не относится):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <cmath>
#include "windows.h"
#include <iostream> 
using namespace std;
 
int main()
{
        const int n=1000; long tmp=1; double sum=1, temp;
        for(int i=0; i<n; i++)
        {
                tmp = (i>0) ? i+1 : tmp ;
                temp=1/(pow((double)tmp, (double)tmp));
                sum = ((i==0) || (i%2)==1) ? ((i>0)?(sum-temp):sum) : (sum + temp);
                if(temp<0.00003f) break;
                
        }
        cout<<"Summ row of type (-1)^(n-1)*1/n^n: ) equal to "<<sum<<endl;
        cin.get();
        return 0;
}
Добавлено через 10 минут
Немного редаетировал свой пример, была ошибка.
1
BitFields
49 / 47 / 3
Регистрация: 03.08.2009
Сообщений: 101
28.08.2009, 13:23  [ТС] #3
А для чего служит cin.get() и зачем он здесь нужен?
0
alex_x_x
бжни
2451 / 1656 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2009, 13:27 #4
аналог getch();
0
mustardandrew
Человек
96 / 80 / 3
Регистрация: 16.06.2009
Сообщений: 229
28.08.2009, 13:38 #5
BitFields, cin.get() служыт для задержки екрана.
1
BitFields
49 / 47 / 3
Регистрация: 03.08.2009
Сообщений: 101
28.08.2009, 14:18  [ТС] #6
Еще один вопрос, почему в данной строке кода :sum только перед sum-temp и нет перед sum+temp?
Я так понимаю операции : эквивалентна операции = в sum заносится результат и что автоматически заносится и во втором элементе тернарной операции (sum+temp).

C++
1
sum = ((i==0) || (i%2)==1) ? ((i>0)?(sum-temp):sum) : (sum + temp);
Автоматически в sum=sum+temp, даже если не определен :sum?

((i>0)?(sum-temp):sum)
Зачем здесь определять :sum?
0
mustardandrew
Человек
96 / 80 / 3
Регистрация: 16.06.2009
Сообщений: 229
28.08.2009, 14:30 #7
Если исполняется условие ((i==0) || (i%2)==1),
тогда
sum = ((i>0)?(sum-temp):sum) и снова раскриваем условие:
если (i>0), sum = sum-temp тогда sum = sum,
а иначе
sum = sum + temp .

Пояснил как смог...
1
BitFields
49 / 47 / 3
Регистрация: 03.08.2009
Сообщений: 101
28.08.2009, 15:07  [ТС] #8
Этот код преобразует строку в число, а затем из этого числа заполняется цифрами

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    char str[4];                 //вводимая строка с 4 символами
    int arr[3], tmpow;        //массив, куда заносятся 3 цифры из числа
    cin>>str;                    //сам ввод(3 цифры-1 число)
    str[3]='\0';                 //отсечь все символы, введеные после 4 символа
    int strint=atoi(str);        //преобразование строки к int
    for(int i=2; i>=0; i--)
    {
        tmpow=pow(10.0f, i);                                   //10^i
        arr[i]=strint/tmpow;                        //заносим в массив
        strint=strint-arr[i]*tmpow;                //вычитаем 100 затем 10 и т.д. 10^i
    }//for(int i=2; i>=0; i--)
    cin.get();
    //Если введено 978: arr[0]=8; arr[1]=7; arr[2]=9;
}
Например, если введена строка "978", тогда arr[0]=8; arr[1]=7; arr[2]=9;
Хотелось бы чтобы массив заполнялся в обратном порядке, т.е. при 978
arr[0]=9; arr[1]=7; arr[2]=8;, желательно без сортировки!
0
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
28.08.2009, 15:26 #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    char str[4];                 //вводимая строка с 4 символами
    int arr[3], tmpow;        //массив, куда заносятся 3 цифры из числа
    cin>>str;                    //сам ввод(3 цифры-1 число)
    str[3]='\0';                 //отсечь все символы, введеные после 4 символа
    
    for(int i = 0; i < 3; ++i)
      arr[i] = str[i] - '0';    
}
Например, если введена строка "978", то arr[0]=9; arr[1]=7; arr[2]=8;
1
mustardandrew
Человек
96 / 80 / 3
Регистрация: 16.06.2009
Сообщений: 229
28.08.2009, 15:28 #10
Если просто нужно записать числа то можно всьо зделать проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
        char str[4];                 
        int arr[3];
        cin>>str; str[3]='\0';
        cin.get(); 
                       
        for(int i=0; i<3; ++i)
        {
             arr[i] = (int)(str[i] - 0x30);
             cout << arr[i] << endl;
        }
 
        cin.get();
 
}
1
BitFields
49 / 47 / 3
Регистрация: 03.08.2009
Сообщений: 101
28.08.2009, 15:53  [ТС] #11
Неплохо вы даже не использовали функцию преобразования int atoi(const char* str),
спойкойно использовали явное преобразование. Получается функция преобразования нужна только для указателей на строку, а иначе(в случае массивов символов можно обойтись без неё)
Теперь еще один вариант решения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
        char str[4], sr=0x30;                 
        int arr[3];
        cin>>str; str[3]='\0';
        cin.get(); 
                       
        for(int i=0; i<3; ++i)
        {
             arr[i]=static_cast<int>(str[i] - sr);
             //cout << arr[i] << endl;
        }
 
        cin.get();
 
}
0
odip
Эксперт С++
7161 / 3223 / 58
Регистрация: 17.06.2009
Сообщений: 14,164
28.08.2009, 19:01 #12
К исходной задаче:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main( void ) {
 
int cnt;
double sum= 1.0, var;
 
for ( cnt= 2; cnt<=1000; cnt++ ) {
    var= 1.0/(cnt*cnt);
    if ( cnt%2 == 0 ) { sum-= var; } else { sum+= var; }
    if ( var<0.00003 ) { break; }
}
cout <<"cnt=" <<cnt <<" sum=" <<sum <<"\n";
return 0;
 
} // main()
1
Qnt
1 / 1 / 0
Регистрация: 17.08.2009
Сообщений: 6
31.08.2009, 14:03 #13
Цитата Сообщение от odip Посмотреть сообщение
К исходной задаче:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main( void ) {
 
int cnt;
double sum= 1.0, var;
 
for ( cnt= 2; cnt<=1000; cnt++ ) {
    var= 1.0/(cnt*cnt);
    if ( cnt%2 == 0 ) { sum-= var; } else { sum+= var; }
    if ( var<0.00003 ) { break; }
}
cout <<"cnt=" <<cnt <<" sum=" <<sum <<"\n";
return 0;
 
} // main()
если рискнуть потерей читабельности программы, то можно сократить код еще слегка
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
void main( void ) {
 
int cnt;
double sum= 1.0, var;
 
for ( cnt= 2; cnt<=1000 && (var= 1./(cnt*cnt))>=0.00003 ; cnt++ ) 
    sum+=(cnt%2)?var:-var;
cout <<"cnt=" <<cnt <<" sum=" <<sum <<"\n"; 
} // main()
1
31.08.2009, 14:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2009, 14:03
Привет! Вот еще темы с ответами:

Оптимизация кода - C++ Builder
Исходный код: //////разбор//// String html_data =_T(&quot;&quot;); innerRe-&gt;ModifierM = true; innerRe-&gt;Expression =...

Оптимизация кода - C++ Builder
У меня в программе обилие циклов, внутри них в основном расчеты и работа с массивами. Имеет ли смысл производить ассемблерные вставки в...

Оптимизация кода - C++ Builder
Вот решил написать что то на подобии &quot;Напоминания события&quot;!))) Вот код: ...

Оптимизация кода - C++ Builder
Приветствую всех. Посмотрите на нижеприведенный код. Возможно ли сделать его проще (например без использования AnsiString и/или цикла)? ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru