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

нужна оптимизация приложения - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Реализовать подпрограммы посредством: А) процедур; Б) функции. http://www.cyberforum.ru/cpp-beginners/thread540587.html
По заданным вещественным числам a_0,a_1,… ,a_30,b_0 ,b_1,… b_30,c_0,c_1,…,c_30,x,y,z. вычислить величину ((a_0 x^30+a_1 x^29+⋯+a_30 )^2-(b_0 y^30+b_1 y^29+⋯+b_30 ))/(c_0 (x+z)^30+c_1 (x+z)^29+⋯+c_30 ) Реализовать подпрограммы посредством: А) процедур; Б) функции.
C++ Дан файл f:file of real. Найти наибольшее из значений компонент. Дан файл f:file of real. Найти наибольшее из значений компонент. http://www.cyberforum.ru/cpp-beginners/thread540586.html
Сортировка(2) C++
Во входном файле содержится информация об каждом из n студентов некоторого вуза, разделённого пробелами: 〈фамилия〉 〈имя〉 〈отчество〉 〈пол〉 〈возраст〉〈курс〉, причем в фамилии – не более 12 букв, пол указывается буквами М и Ж, возраст – целое от 16 до 35, курс – целое от 1 до 5. Ввести эту информацию и напечатать номер курса, на котором наибольший процент мужчин.
C++ Сортировка
Даны действительные числа a_1,…,a_n. Получить попарно различные целые j_1,…,j_n, такие, что 1≤k_j≤n,k=1,…,n, и a_j1≥a_j2≥⋯≥a_jn. Воспользоваться методом: А)Сортировки прямым выбором; Б) «шейкерной» сортировки.
C++ Дано: a:array[1…n] of real;p:real;k:integer;(a[1]<=a[2]<=⋯<=a[n],0<k≤n). http://www.cyberforum.ru/cpp-beginners/thread540581.html
Дано: a:array of real;p:real;k:integer;(a<=a<=⋯<=a,0<k≤n). Удалить из a элемент с номером k (т.е. a) и вставить элемент, равный p, так, чтобы не нарушилась упорядоченность.
C++ Простой класс на основе заданной структуры данных с++ Помогите пожалуйста... Необходимо разработать программу, реализующую простой класс на основе заданной структуры данных. подробнее

Показать сообщение отдельно
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
06.04.2012, 23:11     нужна оптимизация приложения
Как известно положительный int32 выглядит так
5=00000000000000000000000000000101
мы считаем нули сначала
бит.маска mask=1<<30=01000000000000000000000000000000
(старший бит - знак)
мы двигаем маску вправо, чтобы определить порядок числа, пока не доберёмся до старшей единицы.
cnt=2; mask=00000000000000000000000000000100
если видим, что следующий бит=0 (как в примере), то округляем число до 1<<mask=4,
если бы число было 7=00000000000000000000000000000111, то округляем число до 1<<mask+1=8,
Но значение чисел нам не важны и мы эту операцию (1<<mask=)
даже не выполняем вместо этого мы суммируем в переменной result все показатели, т.к 2^n*2^m=2^(n+m)

Как известно ОТРИЦАТЕЛЬНЫЙ int32 выглядит так
-5=11111111111111111111111111111011
мы считаем нули сначала
бит.маска mask=1<<30=01000000000000000000000000000000
(старший бит - знак)
мы двигаем маску вправо, чтобы определить порядок числа, но теперь наоборот: перебираем все единицы, пока не получим старший нуль
Далее аналогично

Добавлено через 5 минут
Цитата Сообщение от lazybiz Посмотреть сообщение
Не хочу пирожков! Хочу Вотрушек!!! (произносится с акцентом)
Kuzia domovenok, я думаю что она и 10-й тест не пройдет..., а если пройдет 10-й, то не пройдет 11-й!...
Ну а как иначе предлагаешь оценить произведение 100000 чисел, каждое 32 разряда, не вызвав переполнение?
Суммировать их порядки - идеальный вариант. Да, проблема - операция получения порядка числа, если кто знает более оптимальный вариант - отзовитесь.
Возможно можно как-то вытащить порядок битовыми операциями c float

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <fstream>
#include <limits>
using namespace std;
//MAXINT32=1<<31-1
int main(){
    ifstream inf("input.txt");
    ofstream outf("output.txt");
    int n, k, num;
    int i, j;
    const int hbit=1<<30;
    int mask;
    int result, cnt;
    int sign;
    int max, max_i;
    inf >> n;
    inf >> k;
    max=1<<31;//MIN_INT32
    max_i=-1;
    sign=1;//positive
    for (i=0; i<k; i++){
        result=0;//резалт хранит сумму порядков всех чисел, сами числа не хранятся.
        for (j=0; j<n; j++){
            mask=hbit;
            inf>>num;
            if (num<0){
                cnt=30;
                while(!(num&mask)){mask=mask>>1;cnt--;}//число положительное, подсчитываем число нулевых битов в 
//начале, чтобы определить ближайшую степень двойки
                if (num&(mask>>1))result+=cnt+1;//если второй по старшинству бит - единица, округляем в большую сторону
                else
                result+=cnt;
            }
            else{
                sign=sign^1; //if (sign==0) sign=1; else sign=0;
                cnt=30;
                while(num&mask){mask=mask>>1; cnt--;}//число отрицательное, подсчитываем число единичных битов в 
//начале, чтобы определить ближайшую степень двойки
                if (num&(mask>>1))result+=cnt;//если второй по старшинству бит - единица, округляем в большую сторону
                else 
                result+=(cnt+1);
            }
        }
        if ((result>max)&&(sign)){//работает если хоть одно произведение положительно. и если нет крайне близких по значению произведений
            result=max;
            max_i=i;
        }
        //else if result==max && sign , то считаем вручную оба произведения.
        //и всё равно все расчёты были приблизительными, но зато сверх быстрыми.
    }
    inf.close();
    outf<< max_i <<"\n";
    outf.close();
    return 0;
}
 
Текущее время: 06:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru