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

C++

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

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

28.08.2009, 12:08. Просмотров 1064. Ответов 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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2009, 12:08     Оптимизация
Посмотрите здесь:

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

Оптимизация - C++ WinAPI
Ребят у меня тут вопрос как оптимизировать программу if (selectedIndex == 0) { } if (selectedIndex == 1) {

Оптимизация робота - C++
Написал вот эту задачу: Робот Имя входного файла: robot.in Имя выходного файла: robot.out Ограничение по времени: 2 секунды ...

Оптимизация вычислений - C++
Есть код: fstream file(&quot;out13.txt&quot;, ios::out); int index, summ; for(index = 0; index&lt;=9; ++index) { cout &lt;&lt;...

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

Оптимизация памяти - C++
Доброго времени суток. У меня есть класс(код показывать не буду, он не нужен), в приватном поле есть переменная типа int *, то есть класс...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 минут
Немного редаетировал свой пример, была ошибка.
BitFields
49 / 47 / 3
Регистрация: 03.08.2009
Сообщений: 101
28.08.2009, 13:23  [ТС]     Оптимизация #3
А для чего служит cin.get() и зачем он здесь нужен?
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
28.08.2009, 13:27     Оптимизация #4
аналог getch();
mustardandrew
Человек
96 / 80 / 3
Регистрация: 16.06.2009
Сообщений: 229
28.08.2009, 13:38     Оптимизация #5
BitFields, cin.get() служыт для задержки екрана.
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?
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 .

Пояснил как смог...
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;, желательно без сортировки!
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;
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();
 
}
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();
 
}
odip
Эксперт С++
7156 / 3296 / 59
Регистрация: 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()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2009, 14:03     Оптимизация
Еще ссылки по теме:

Оптимизация программы - C++
Нужно, чтобы программа случайным образом придумывала число от 1 до 32767 и печатала его цифры через 2 пробела. (Например, 4236 печатает 4 ...

Оптимизация программы - C++
Ув. обыватели, Вчера написал &quot;Калькулятор&quot;, но так как я ещё зеленый в программировании на С++, прошу вас показать как и где можно...

Циклы и их оптимизация - C++
Доброго времени суток! Имеется код программы, необходимо оптимизировать вложенный цикл чтобы время потраченное на выполнение программы...

Оптимизация программы - C++
Здравствуйте,задали задачку :Напишите программу, которая будет выполнять последовательность запросов вида ADD num, PRESENT num и COUNT (без...


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

Или воспользуйтесь поиском по форуму:
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()
Yandex
Объявления
31.08.2009, 14:03     Оптимизация
Ответ Создать тему
Опции темы

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