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

Надо ускорить алгоритм вычисления чисел с не повторяющимися цифрами - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Считывание символа с потока для дальнейших действий http://www.cyberforum.ru/cpp-beginners/thread629100.html
Пользователь должен по запросу ввести символ для определения операции: сложения, вычитания или умножения матрицы на число. Не получается считать этот символ с потока. VC++.6 #include <stdio.h> const int m = 2; const int n = 3; void InitMatrix(int A); void PrintMatrix(int A); void Addition(int A1,int A2,int A3);
C++ Компилятор просит указать const в конструкторе Всем привет. Изучаю С++ по Р.Лафоре. В одном из заданий, к главе 8 понадобилось написать класс, представляющий простую дробь, и написать перегруженные операторы: -, +, * и /. Собственно проблем никаких - написал, перегрузил. Решил перегрузить заодно и оператор присваивания, путём указания соответствующего конструктора с одним аргументом того же типа: ... код ... Fract(Fract fr) : ... http://www.cyberforum.ru/cpp-beginners/thread629094.html
MessageBox API C++
MessageBox API: не получаеться обработать выбор. Мой код: int SELECT = MessageBox(hwnd, _T("Вы действительно хотите завершить работу программы? ВНИМАНИЕ! В случае завершения работы программы, клиенты не смогут подключиться."), _T("Завершение работы"), MB_OKCANCEL | MB_ICONQUESTION); if (SELECT = MB_OK) { PostQuitMessage(0); }
Перегрузка потокового оператора (<<). Выдает адрес вместо значения C++
Сабж. Все компелится нормально. Если делать << void то работает ок см комменты если делать класса std::ostream& то возвращает 16чное значение. Заранее спасибо #ifndef Point_HPP // anti multiply including gates #define Point_HPP #include <sstream>
C++ Реализовать шаблонный класс http://www.cyberforum.ru/cpp-beginners/thread629066.html
В общем требуется реализовать шаблонный класс FixedArray<T,N> FixedArray - абстракция вокруг T Использование выглядит как то так: FixedArray<std::vector, 8> myArr1 = {1, 2, 3, 4}; FixedArray<std::string, 8> strArr = {"a", "b", "c", "d"};
C++ stdlib.h - quicksort Идея такова: отсортировать массив A очень быстрым методом Хоара. Пробовал в stdlib.h делать QuickSort - ничего не получилось. Все значения элементов - до 263-1. Т.е. влазят в тип long. Помогите отсортировать! подробнее

Показать сообщение отдельно
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
26.07.2012, 15:07     Надо ускорить алгоритм вычисления чисел с не повторяющимися цифрами
Помогите ускорить алгоритм. Надо определить все числа с не повторяющимися цифрами от 0 до 9876543210. У меня время просчета занимает очень длительное время уже на 8-значном числе. Что-то не могу догнать как сделать быстрее. Вот код:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <vector>
#include <time.h>
#include <Windows.h>
using namespace std;
 
const int size = 1000000; //нужно ускорить алгоритм до разумного время просчета максимального числа 9876543210
bool isunique(int);       //проверяет число на повторяющиеся цифры
void bubbleSort(int* arr, int size);     //Сортировка пузырьком(обменом)
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
    clock_t time;
    time = clock();  //время начала отсчета
    vector<int> uniqueNumbers;
    for (int i = 0; i<size; i++)
    {
        if (isunique(i))        //если число без повторяющихся цифр
            uniqueNumbers.push_back(i);  //закинуть его в вектор
    }
    time = clock() - time;  //время конца отсчета
    for (int i = uniqueNumbers.size()-100; i<uniqueNumbers.size(); i++) //выводим 100 последних елемента для проверки правильности работы
        cout<<uniqueNumbers[i]<<" ";
    cout<<endl<<endl<<"================================================================================\n";
    //выводим время работы
    double timeOfWork = static_cast<double>(time)/CLOCKS_PER_SEC;
    if (timeOfWork<60)
        cout<<"Вычисления длились "<<timeOfWork<<" секунд\n";
    else if (timeOfWork<3600)
        cout<<"Вычисления длились "<<timeOfWork/60<<" минут, "<<static_cast<int>(timeOfWork)%60<<"секунд\n";
    else
        cout<<"Очень долго"<<endl;
 
    system("pause");
    return 0;
}
 
bool isunique(int n)
{
    if (n>9876543210)
        return false;
    int count = 1;  //количество цифр в числе n
    double temp = n;
    while ((temp/=10) > 1)
        count++;
    int* digits = new int[count];
    int j = 1;
    temp = count;
    while (--temp)
        j*=10;  // делитель для получения остатка от деления
   for (int i = 0; i<count; i++)  // закидываем цифры в массив по порядку
    {
        digits[i] = n/j;  // поделить на делитель и получить цифру
        n-=(j*digits[i]);           // отнять первую цифру от числа спереди
        j/=10;             //уменшить делитель на 10
    }
    // сортировка массива:
    bubbleSort(digits, count);
    for (int i = 0; i<count-1; i++)
    {
        if (digits[i]==digits[i+1])
        {
            delete [] digits;
            return false;
        }
    }
    delete [] digits;
    return true;
}
void bubbleSort(int* arr, int size)
{
    int tmp;
 
    for(int i = 0; i < size - 1; ++i) // i - номер прохода
    {            
        for(int j = 0; j < size - 1; ++j) // внутренний цикл прохода
        {     
            if (arr[j + 1] < arr[j]) 
            {
                tmp = arr[j + 1]; 
                arr[j + 1] = arr[j]; 
                arr[j] = tmp;
            }
        }
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 12:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru